为什么 silex 错误处理程序不是 运行?
Why does the silex error handler not run?
我有一个 silex 应用程序。我有一个注册的通用处理程序:
$app->error(function (\Exception $e) use ($app) {
return (new JsonResponse(['message' => 'Something truly horrible happened. Sorry.', 500)])->send();
}
);
然而,当某些东西在 $app::share()
中抛出异常时,它不会触发:
$app->share(function () {
throw new \Exception('wtf');
}));
这个异常不会被错误处理程序处理,而是直接弹出,就好像根本没有处理程序一样:
exception 'Exception' with message 'wtf' in appinit.php:230
Stack trace: #0 ./vendor/pimple/pimple/lib/Pimple.php(126): Closure$#12() #1 ./vendor/pimple/pimple/lib/Pimple.php(83): Closure$Pimple::share() #2 ./web/appinit.php(234): Pimple->offsetGet() #3 app.php(6): include() #4 {main}
我只是期待一个基本的 400 Bad Request 响应,其内容为:
{
"message": "Something truly horrible happened. Sorry.",
}
为什么我的处理程序没有激活?
在 silex 中,错误处理程序只处理中间件上发生的异常。所以实际上,永远不会调用错误,这是设计使然,因为异常发生在:
try {
$app->run()
} catch(\Exception $e) {
// this will be caught
}
我有一个 silex 应用程序。我有一个注册的通用处理程序:
$app->error(function (\Exception $e) use ($app) {
return (new JsonResponse(['message' => 'Something truly horrible happened. Sorry.', 500)])->send();
}
);
然而,当某些东西在 $app::share()
中抛出异常时,它不会触发:
$app->share(function () {
throw new \Exception('wtf');
}));
这个异常不会被错误处理程序处理,而是直接弹出,就好像根本没有处理程序一样:
exception 'Exception' with message 'wtf' in appinit.php:230
Stack trace: #0 ./vendor/pimple/pimple/lib/Pimple.php(126): Closure$#12() #1 ./vendor/pimple/pimple/lib/Pimple.php(83): Closure$Pimple::share() #2 ./web/appinit.php(234): Pimple->offsetGet() #3 app.php(6): include() #4 {main}
我只是期待一个基本的 400 Bad Request 响应,其内容为:
{
"message": "Something truly horrible happened. Sorry.",
}
为什么我的处理程序没有激活?
在 silex 中,错误处理程序只处理中间件上发生的异常。所以实际上,永远不会调用错误,这是设计使然,因为异常发生在:
try {
$app->run()
} catch(\Exception $e) {
// this will be caught
}