comparison Lib/IMPL/AppException.pm @ 278:4ddb27ff4a0b

core refactoring
author cin
date Mon, 04 Feb 2013 02:10:37 +0400
parents 89179bb8c388
children
comparison
equal deleted inserted replaced
277:6585464c4664 278:4ddb27ff4a0b
9 use Carp qw(longmess shortmess); 9 use Carp qw(longmess shortmess);
10 use Scalar::Util qw(refaddr); 10 use Scalar::Util qw(refaddr);
11 11
12 use IMPL::Const qw(:prop); 12 use IMPL::Const qw(:prop);
13 use IMPL::Resources::Strings { 13 use IMPL::Resources::Strings {
14 messageFormat => "Application exception" 14 message => "Application exception"
15 }; 15 };
16 16
17 use IMPL::declare { 17 use IMPL::declare {
18 base => [ 18 base => [
19 'IMPL::Object' => undef 19 'IMPL::Object' => undef
20 ], 20 ],
21 props => [ 21 props => [
22 source => PROP_RO, 22 source => PROP_RO,
23 callStack => PROP_RO, 23 callStack => PROP_RO,
24 _cachedMessage => PROP_RW
25 ] 24 ]
26 }; 25 };
27 26
28 sub new { 27 sub new {
29 my $self = shift; 28 my $self = shift;
32 31
33 $instance->source(shortmess); 32 $instance->source(shortmess);
34 $instance->callStack(longmess); 33 $instance->callStack(longmess);
35 34
36 return $instance; 35 return $instance;
37 }
38
39
40 sub message {
41 my ($this) = @_;
42
43 if (my $msg = $this->_cachedMessage) {
44 return $msg;
45 } else {
46 my $formatter = $this->can('messageFormat');
47 return $this->_cachedMessage($formatter->($this));
48 }
49 } 36 }
50 37
51 sub ToString { 38 sub ToString {
52 my ($this) = @_; 39 my ($this) = @_;
53 40
59 46
60 die $self->new(@_); 47 die $self->new(@_);
61 } 48 }
62 49
63 1; 50 1;
51
52 __END__
53
54 =pod
55
56 =head1 NAME
57
58 C<IMPL::AppException> - исключение приложения.
59
60 =head1 SYNOPSIS
61
62 =begin code
63
64 package MyException;
65 use strict;
66
67 use IMPL::Const qw(:prop);
68 use IMPL::declare {
69 base => [
70 'IMPL::AppException' => undef
71 ],
72 props => [
73 level => PROP_RO
74 ]
75 };
76
77 use IMPL::Resources::Strings {
78 message => "Something wrong at level %level%"
79 };
80
81 sub CTOR {
82 my ($this,$level) = @_;
83
84 $this->level($level);
85 }
86
87 =end code
88
89 =head1 DESCRIPTION
90
91 Для описания собственных исключений в качестве базового класса должен
92 использоваться C<IMPL::AppException> поскольку он позволяет использовать
93 C<IMPL::declare> и объявлять свойства.
94
95 C<IMPL::Exception> также является классом для исключений, однако поскольку
96 он используется в базовых механизмах библиотеки, то в нем не реализованы
97 механизмы для описания свойсвт.
98
99 Исключение имеет свойство C<message> которое возвращает текст с описанием
100 проблемы, данное свойство можно реализовать с использованием
101 C<IMPL::Resources::Strings> для реализации поддержки нескольких языков.
102
103 Особенностью тсключений также является то, что при их создании автоматически
104 фиксируется место, где оно было создано и свойства C<source> и C<callStack>
105 заполняются автоматически.
106
107 Для исключений переопределены операторы приведения к строке и к булевому
108 значению.
109
110 =head1 MEMBERS
111
112 =head2 C<[op]new(@args)>
113
114 Оператор создающий новый экземпляр исключения, сначала создает экземпляр
115 исключения, затем заполняет свойства C<source>, C<callStack>.
116
117 =head2 C<[op]throw(@args)>
118
119 Создает объект исключения и бросает его.
120
121 =begin code
122
123 throw MyException(10);
124 MyException->throw(10); # ditto
125
126 =end code
127
128 =head2 C<[get]source>
129
130 Строка с описанием в каком файле и где произошло исключение. см. C<Carp>
131
132 =head2 C<[get]callStack>
133
134 Строка со стеком вызовов в момент возникновения исключения. см. C<Carp>
135
136 =head2 C<[get]message>
137
138 Возвращает описание исключения.
139
140 =head2 C<ToString()>
141
142 Возвращает текстовое представление, как правило это C<message> и C<callStack>.
143
144 =cut