407
|
1 package IMPL::AppException;
|
|
2 use strict;
|
|
3 use mro 'c3';
|
|
4 use overload
|
|
5 '""' => 'ToString',
|
|
6 'bool' => sub { return 1; },
|
|
7 'fallback' => 1;
|
|
8
|
|
9 use Carp qw(longmess shortmess);
|
|
10 use Scalar::Util qw(refaddr);
|
|
11
|
|
12 use IMPL::Const qw(:prop);
|
|
13 use IMPL::Resources::Strings {
|
|
14 message => "Application exception"
|
|
15 };
|
|
16
|
|
17 use IMPL::declare {
|
|
18 base => [
|
|
19 'IMPL::Object' => undef
|
|
20 ],
|
|
21 props => [
|
|
22 source => PROP_RO,
|
|
23 callStack => PROP_RO,
|
|
24 ]
|
|
25 };
|
|
26
|
|
27 sub new {
|
|
28 my $self = shift;
|
|
29
|
|
30 my $instance = $self->next::method(@_);
|
|
31
|
|
32 $instance->source(shortmess);
|
|
33 $instance->callStack(longmess);
|
|
34
|
|
35 return $instance;
|
|
36 }
|
|
37
|
|
38 sub ToString {
|
|
39 my ($this) = @_;
|
|
40
|
|
41 return join("\n", $this->message, $this->callStack);
|
|
42 }
|
|
43
|
|
44 sub throw {
|
|
45 my $self = shift;
|
|
46
|
|
47 die $self->new(@_);
|
|
48 }
|
|
49
|
|
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 |