Mercurial > pub > Impl
comparison lib/IMPL/Exception.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
406:f23fcb19d3c1 | 407:c6e90e02dd17 |
---|---|
1 package IMPL::Exception; | |
2 use strict; | |
3 use overload | |
4 '""' => \&ToString, | |
5 'fallback' => 1; | |
6 use Carp qw(longmess shortmess); | |
7 use Scalar::Util qw(refaddr); | |
8 | |
9 BEGIN { | |
10 require Error; | |
11 } | |
12 | |
13 use parent qw(IMPL::Object::Abstract Error Class::Accessor); | |
14 | |
15 BEGIN { | |
16 __PACKAGE__->mk_accessors( qw(Message Args CallStack Source) ); | |
17 } | |
18 | |
19 sub indent { | |
20 my ($str,$level) = @_; | |
21 $level ||= 0; | |
22 $str = '' unless defined $str; | |
23 join ("\n", map( " "x$level.$_ , split(/\n/,$str) ) ); | |
24 } | |
25 | |
26 sub new { | |
27 my $class = shift; | |
28 $class = ref $class || $class; | |
29 | |
30 my $this = $class->Error::new() or die "Failed to create an exception"; | |
31 | |
32 $this->callCTOR(@_); | |
33 $this->{-text} = $this->Message; | |
34 | |
35 local $Carp::CarpLevel = 0; | |
36 | |
37 $this->CallStack(longmess); | |
38 $this->Source(shortmess); | |
39 | |
40 return $this; | |
41 } | |
42 | |
43 sub CTOR { | |
44 my ($this,$message,@args) = @_; | |
45 $this->Message($message || ''); | |
46 die new IMPL::Exception("Fatal erorr: cyclic structure in the exceptions were detected, do not use \$\@ while throwing the exception!") if grep ref $_ ? refaddr($this) == refaddr($_) : 0 , @args; | |
47 $this->Args([map defined $_ ? $_ : 'undef', @args]); | |
48 } | |
49 | |
50 sub save { | |
51 my ($this,$ctx) = @_; | |
52 | |
53 $ctx->AddVar(Message => $this->Message) if $this->Message; | |
54 $ctx->AddVar(Args => $this->Args) if @{$this->Args}; | |
55 $ctx->AddVar(Source => $this->Source); | |
56 $ctx->AddVar(CallStack => $this->CallStack); | |
57 } | |
58 | |
59 sub restore { | |
60 my ($class,$data,$instance) = @_; | |
61 | |
62 my %args = @$data; | |
63 | |
64 if ($instance) { | |
65 $instance->callCTOR($args{Message},@{$args{Args}}); | |
66 } else { | |
67 $instance = $class->new($args{Message},@{$args{Args}}); | |
68 } | |
69 | |
70 $instance->Source($args{Source}); | |
71 $instance->CallStack($args{CallStack}); | |
72 | |
73 return $instance; | |
74 } | |
75 | |
76 sub ToString { | |
77 my $this = shift; | |
78 | |
79 $this->toString(); | |
80 } | |
81 | |
82 sub toString { | |
83 my ($this,$notrace) = @_; | |
84 ($this->Message || ref $this) . join("\n",'',map { my $s = $_; local $_; indent("$s",1) } @{$this->Args} ) . ( $notrace ? '' : "\n" . $this->CallStack); | |
85 } | |
86 | |
87 package IMPL::InvalidOperationException; | |
88 our @ISA = qw(IMPL::Exception); | |
89 __PACKAGE__->PassThroughArgs; | |
90 | |
91 package IMPL::InvalidArgumentException; | |
92 our @ISA = qw(IMPL::Exception); | |
93 our %CTOR = ( | |
94 'IMPL::Exception' => sub { "An invalid argument", @_ } | |
95 ); | |
96 | |
97 package IMPL::DuplicateException; | |
98 our @ISA = qw(IMPL::Exception); | |
99 __PACKAGE__->PassThroughArgs; | |
100 | |
101 package IMPL::KeyNotFoundException; | |
102 our @ISA = qw(IMPL::Exception); | |
103 __PACKAGE__->PassThroughArgs; | |
104 | |
105 our %CTOR = ( | |
106 'IMPL::Exception' => sub { "A specified element isn't found", $_[0] } | |
107 ); | |
108 | |
109 package IMPL::NotImplementedException; | |
110 our @ISA = qw(IMPL::Exception); | |
111 __PACKAGE__->PassThroughArgs; | |
112 | |
113 package IMPL::SecurityException; | |
114 our @ISA = qw(IMPL::Exception); | |
115 __PACKAGE__->PassThroughArgs; | |
116 | |
117 package IMPL::AccessDeniedException; | |
118 our @ISA = qw(IMPL::SecurityException); | |
119 our %CTOR = ( 'IMPL::SecurityException' => sub { 'Access denied' ,@_ } ); | |
120 | |
121 package Exception; | |
122 our @ISA = qw(IMPL::Exception); | |
123 __PACKAGE__->PassThroughArgs; | |
124 | |
125 package IMPL::DeprecatedException; | |
126 our @ISA = qw(IMPL::Exception); | |
127 our %CTOR = ( | |
128 'IMPL::Exception' => sub { @_ ? @_ : "The method is deprecated" } | |
129 ); | |
130 | |
131 package IMPL::WrongDataException; | |
132 our @ISA = qw(IMPL::Exception); | |
133 our %CTOR = ( | |
134 'IMPL::Exception' => sub { "The input data is wrong", @_ } | |
135 ); | |
136 | |
137 package IMPL::IOException; | |
138 our @ISA = qw(IMPL::Exception); | |
139 __PACKAGE__->PassThroughArgs; | |
140 | |
141 1; |