X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=b9dc3f187601c4c9f127bfc742b109fb7e4c5bd9;hp=d84ddbf3aee19ae3bcf0561488afa2e055d8b512;hb=660f9bb0ce5e5ccb7d126608cf8b908194167b59;hpb=7af15a33a6d54bdd91fe1635612c54fe026694bc diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index d84ddbf..b9dc3f1 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'; @@ -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);