Mercurial > pub > Impl
annotate Lib/IMPL/Web/Handler/ErrorHandler.pm @ 399:753e981782ce
sync
| author | cin | 
|---|---|
| date | Mon, 12 May 2014 18:04:40 +0400 | 
| parents | 38cb0b80e88e | 
| children | b79081b70a7a | 
| rev | line source | 
|---|---|
| 206 | 1 package IMPL::Web::Handler::ErrorHandler; | 
| 2 use strict; | |
| 3 | |
| 233 | 4 use IMPL::Const qw(:prop); | 
| 206 | 5 use IMPL::Exception(); | 
| 6 use IMPL::declare { | |
| 7 require => { | |
| 8 WebException => 'IMPL::Web::Exception', | |
| 9 ArgumentException => '-IMPL::InvalidArgumentException', | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
10 IOException => '-IMPL::IOException', | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
11 HttpResponse => 'IMPL::Web::HttpResponse' | 
| 206 | 12 }, | 
| 13 base => { | |
| 14 'IMPL::Object' => undef, | |
| 15 'IMPL::Object::Autofill' => '@_', | |
| 16 'IMPL::Object::Serializable' => undef | |
| 233 | 17 }, | 
| 18 props => [ | |
| 19 errors => PROP_RW, | |
| 353 | 20 view => PROP_RW, | 
| 233 | 21 fallback => PROP_RW, | 
| 22 contentType => PROP_RW | |
| 23 ] | |
| 206 | 24 }; | 
| 25 | |
| 26 sub CTOR { | |
| 27 my ($this) = @_; | |
| 28 | |
| 353 | 29 die ArgumentException->new("view") unless $this->view; | 
| 206 | 30 die ArgumentException->new("fallback") unless $this->fallback; | 
| 31 | |
| 32 $this->errors({}) unless $this->errors; | |
| 33 | |
| 34 } | |
| 35 | |
| 36 sub Invoke { | |
| 37 my ($this,$action,$next) = @_; | |
| 38 | |
| 39 undef $@; | |
| 40 my $result; | |
| 41 eval { | |
| 42 $result = $next ? $next->($action) : undef; | |
| 43 }; | |
| 44 | |
| 45 if (my $err = $@) { | |
| 
256
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
233 
diff
changeset
 | 
46 | 
| 206 | 47 my $vars = { | 
| 48 error => $err | |
| 49 }; | |
| 50 | |
| 230 | 51 my $status = "500 Internal Server Error"; | 
| 206 | 52 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
53 if (eval { $err->isa(WebException) }) { | 
| 230 | 54 $status = $err->status; | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
55 } | 
| 206 | 56 | 
| 230 | 57 my ($code) = ($status =~ m/^(\d+)/); | 
| 58 | |
| 353 | 59 my $text = $this->view->display( | 
| 60 $err, | |
| 61 $this->errors->{$code} || $this->fallback, | |
| 398 | 62 $vars | 
| 353 | 63 ); | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
64 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
65 $result = HttpResponse->new( | 
| 230 | 66 status => $status, | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
67 type => $this->contentType, | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
68 charset => 'utf-8', | 
| 230 | 69 headers => eval{ $err->headers } || {}, | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
70 body => $text | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
71 ); | 
| 206 | 72 } | 
| 73 | |
| 74 return $result; | |
| 75 } | |
| 76 | |
| 213 | 77 1; | 
| 78 | |
| 79 __END__ | |
| 80 | |
| 81 =pod | |
| 82 | |
| 83 =head1 NAME | |
| 84 | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
85 C<IMPL::Web::Handler::ErrorHandler> - обертка для обработки исключений. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
86 | 
| 213 | 87 =head1 SYNOPSIS | 
| 88 | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
89 Используется в цеопчке обработчиков приложения. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
90 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
91 =begin code xml | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
92 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
93 <handlers type="ARRAY"> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
94 <item type="IMPL::Web::Handler::ErrorHandler"> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
95 <contentType>text/html</contentType> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
96 <loader refid="tt-loader"/> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
97 <errors type="HASH"> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
98 <error extname="500">errors/500</error> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
99 <error extname="404">errors/404</error> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
100 <error extname="403">errors/403</error> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
101 </errors> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
102 <fallback>errors/500</fallback> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
103 </item> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
104 </handlers> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
105 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
106 =end code xml | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
107 | 
| 213 | 108 =head1 DESCRIPTION | 
| 109 | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
110 Позволяет создать представление для ресурса в случае ошибки, для этого | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
111 используется соответствие представлений и кодов ошибок. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
112 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
113 В результате обработчик либо прозрачно передает результат вышестоящего | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
114 обработчика нижестоящему, либо создает C<IMPL::Web::HttpResponse> с | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
115 соответствующим статусом и содержанием. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
116 | 
| 213 | 117 =cut | 
