Mercurial > pub > Impl
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 |
