[Catalyst] error handling

Ash Berlin ash_cpan at firemirror.com
Mon Dec 10 15:07:20 GMT 2007


On 10 Dec 2007, at 14:44, Angel Kolev wrote:

> sub auto : Private {
>   my ($self, $c) = @_;
>   if (@{$c->error}) {
>       $c->stash->{error} = " Critical ERROR!! Probably missing data  
> in database.";
>       $c->forward('/error');
>       $c->error(0);
>       return 0;
>   }
> }
>
> This dont work. @{$c->error} or scalar @{$c->error} always print 0  
> in my debug screen.
>
> Felix Antonius Wilhelm Ostmann wrote:
>> $c->error is a arrayref or not?
>>
>> So you must do this:
>>
>> if( @{$c->error} ) {
>> ...
>> }
>>
>> Angel Kolev schrieb:
>>> Hi,all. Can anyone eplain me a bit about error handling. Where i  
>>> can catch it and when? I use this:
>>>
>>> MyApp::C::MyController
>>>
>>> sub auto : Private {
>>>   my ($self, $c) = @_;
>>>   if ($c->error) {
>>>       $c->stash->{error} = " Critical ERROR!! ";
>>>       $c->forward('/error');
>>>       $c->error(0);
>>>       return 0;
>>>   }
>>>
>>> }
>>>
>>> This works but then all my subs in this controller are redirected  
>>> to /error.
>>>

http://search.cpan.org/~mramberg/Catalyst-Runtime-5.7011/lib/Catalyst.pm#$c-%3Efinalize_error

You need to create a sub finalize_error in your MyApp.pm to catch  
errors. auto will happen before any errors take place, so of course it  
will have nothing in it.

sub finalize_error {
   my ($c) = @_; # Note, not ($self, $c)

   if ( @{$c->errors} ) {
     $c->stash->template('error.tt');
     # You might also need to forward to the view here yourself
     return;
   }
   $c->NEXT::finalize_error();
}

Something like that anyway - untested.



More information about the Catalyst mailing list