[Catalyst] Trapping exceptions in Catalyst.pm

Ton Voon ton.voon at opsera.com
Wed Aug 4 08:06:04 GMT 2010


On 2 Aug 2010, at 07:49, Bill Moseley wrote:

> In execute() there's this code:
>
>     eval { $c->state( $code->execute( $class, $c, @{ $c->req- 
> >args } ) || 0 ) };
>
>     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and  
> $stats_info;
>
>     my $last = pop( @{ $c->stack } );
>
>     if ( my $error = $@ ) {
>
> The problem is that it's possible for the eval to fail but $@ is not  
> set.  An example is where Locale::Maketext localizes $@ so that  
> exceptions come back with $@ undefined (for some odd reason).
>
> In general, it's better to test the return value from eval directly  
> instead of depend on $@.  Something like:
>
> my $has_exception;
> eval { $c->state( $code->execute( $class, $c, @{ $c->req->args } )  
> || 0 ); 1; } || $has_exception++;
> ...
> if ( $has_exception ) {
>
> Or use the "eval {....; 1 } || do { my $msg = $@; ...};" style.

I did a bit of work in DBIx::Class where I changed all the eval  
statements to using Try::Tiny instead. Not sure if it got into trunk  
yet. A similar conversion here would work.

Ton




More information about the Catalyst mailing list