X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=39d513d6b9ba01f80ef74d5414ba7e2df8da0de1;hb=0fb9468872e905cacecbff82b31170f7c7b1a081;hp=d84ddbf3aee19ae3bcf0561488afa2e055d8b512;hpb=dcd195889451b91967d7d231e9b978619c18c9e1;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index d84ddbf..39d513d 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -43,6 +43,7 @@ use Plack::Middleware::IIS7KeepAliveFix; use Plack::Middleware::LighttpdScriptNameFix; use Plack::Middleware::ContentLength; use Plack::Middleware::Head; +use Plack::Middleware::HTTPExceptions; use Plack::Util; use Class::Load 'load_class'; @@ -122,7 +123,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.90059_003'; +our $VERSION = '5.90059_004'; sub import { my ( $class, @arguments ) = @_; @@ -1896,7 +1897,25 @@ Finalizes error. =cut -sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) } +sub finalize_error { + my $c = shift; + if($#{$c->error} > 0) { + $c->engine->finalize_error( $c, @_ ); + } else { + my ($error) = @{$c->error}; + if( + blessed $error && + ($error->can('as_psgi') || $error->can('code')) + ) { + # In the case where the error 'knows what it wants', becauses its PSGI + # aware, just rethow and let middleware catch it + $error->can('rethrow') ? $error->rethrow : croak $error; + croak $error; + } else { + $c->engine->finalize_error( $c, @_ ) + } + } +} =head2 $c->finalize_headers @@ -2013,10 +2032,13 @@ sub handle_request { my $c = $class->prepare(@arguments); $c->dispatch; $status = $c->finalize; - } - catch { + } catch { chomp(my $error = $_); $class->log->error(qq/Caught exception in engine "$error"/); + #rethow if this can be handled by middleware + if(blessed $error && ($error->can('as_psgi') || $error->can('code'))) { + $error->can('rethrow') ? $error->rethrow : croak $error; + } }; $COUNT++; @@ -3105,6 +3127,7 @@ sub registered_middlewares { my $class = shift; if(my $middleware = $class->_psgi_middleware) { return ( + Plack::Middleware::HTTPExceptions->new, Plack::Middleware::ContentLength->new, Plack::Middleware::Head->new, @$middleware);