diff lib/IMPL/AppException.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children b0481c071bea
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMPL/AppException.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,144 @@
+package IMPL::AppException;
+use strict;
+use mro 'c3';
+use overload
+    '""' => 'ToString',
+    'bool'     =>   sub { return 1; },
+    'fallback' => 1;
+
+use Carp qw(longmess shortmess);
+use Scalar::Util qw(refaddr);
+
+use IMPL::Const qw(:prop);
+use IMPL::Resources::Strings {
+	message => "Application exception"
+};
+
+use IMPL::declare {
+    base => [
+        'IMPL::Object' => undef
+    ],
+    props => [
+        source => PROP_RO,
+        callStack => PROP_RO,
+    ]
+};
+
+sub new {
+	my $self = shift;
+	
+	my $instance = $self->next::method(@_);
+	
+	$instance->source(shortmess);
+	$instance->callStack(longmess);
+    
+    return $instance;
+}
+
+sub ToString {
+	my ($this) = @_;
+	
+	return join("\n", $this->message, $this->callStack);
+}
+
+sub throw {
+	my $self = shift;
+	
+	die $self->new(@_);
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::AppException> - исключение приложения.
+
+=head1 SYNOPSIS
+
+=begin code
+
+package MyException;
+use strict;
+
+use IMPL::Const qw(:prop);
+use IMPL::declare {
+    base => [
+        'IMPL::AppException' => undef
+    ],
+    props => [
+        level => PROP_RO
+    ] 
+};
+
+use IMPL::Resources::Strings {
+    message => "Something wrong at level %level%"
+};
+
+sub CTOR {
+    my ($this,$level) = @_;
+    
+    $this->level($level);
+}
+
+=end code
+
+=head1 DESCRIPTION
+
+Для описания собственных исключений в качестве базового класса должен
+использоваться C<IMPL::AppException> поскольку он позволяет использовать
+C<IMPL::declare> и объявлять свойства.
+
+C<IMPL::Exception> также является классом для исключений, однако поскольку
+он используется в базовых механизмах библиотеки, то в нем не реализованы
+механизмы для описания свойсвт.
+
+Исключение имеет свойство C<message> которое возвращает текст с описанием
+проблемы, данное свойство можно реализовать с использованием
+C<IMPL::Resources::Strings> для реализации поддержки нескольких языков.
+
+Особенностью тсключений также является то, что при их создании автоматически
+фиксируется место, где оно было создано и свойства C<source> и C<callStack>
+заполняются автоматически.
+
+Для исключений переопределены операторы приведения к строке и к булевому
+значению.
+
+=head1 MEMBERS
+
+=head2 C<[op]new(@args)>
+
+Оператор создающий новый экземпляр исключения, сначала создает экземпляр
+исключения, затем заполняет свойства C<source>, C<callStack>.
+
+=head2 C<[op]throw(@args)>
+
+Создает объект исключения и бросает его.
+
+=begin code
+
+throw MyException(10);
+MyException->throw(10); # ditto
+
+=end code
+
+=head2 C<[get]source>
+
+Строка с описанием в каком файле и где произошло исключение. см. C<Carp>
+
+=head2 C<[get]callStack>
+
+Строка со стеком вызовов в момент возникновения исключения. см. C<Carp>
+
+=head2 C<[get]message>
+
+Возвращает описание исключения.
+
+=head2 C<ToString()>
+
+Возвращает текстовое представление, как правило это C<message> и C<callStack>.
+
+=cut
\ No newline at end of file