我可以在 Silex 中禁用 error/exception 处理吗?
Can I disable error/exception handling in Silex?
我正在构建一个基于 Silex 1.3 的应用程序。这是我第一次接触Silex,所以不是很熟悉。
我想使用我自己的 error/exception 处理程序,它基本上是一个 class 注册自己,然后将捕获所有错误、致命错误和未捕获的异常并处理它们,要么在开发中使用 Whoops,或者在生产中使用优雅的处理程序。
但是,一旦我进入 silex 控制器、中间件等,Silex 将接管并使用它自己的错误处理。我的仍然会捕获致命错误,因为 Silex 显然不会关闭,但其他所有内容都被 Silex 的默认 "Something went wrong" 页面替换。
我知道我可以使用 $app->error() 来覆盖 Silex 处理错误的方式,但我还没有找到一种方法来从那里将事情设置回原来的 ErrorHandler,或者覆盖 WHETHER Silex处理错误。
那么,有谁知道如何 a) 使用 $app->error() 或其他方式告诉 Silex 使用我的错误处理程序,b) 完全禁用 Silex 中的错误处理,或 c) 作为最后的手段,让 Silex 捕获致命错误,这样我就可以在 $app->error()?
中处理所有三种类型
由于这是我第一次使用 Silex,如果有更好的方法,请随时纠正我或告诉我您如何处理 Silex 中的错误,但如果可以的话,也请回答问题。
一些示例代码:
// This will register itself and then handle all errors.
$handler = new ErrorHandler();
// These are all handled appropriately.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
trigger_error("example"); // Correctly caught by ErrorHandler::handlePhpError
throw new \Exception("example"); // Correctly caught by ErrorHandler::handleException
$app = new \Silex\Application();
$app->get('/', function () use ($app) {
// This is still handled correctly.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
// However, these are now overridden by Silex.
trigger_error("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
throw new \Exception("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
});
$app->run();
还有一个非常简化的ErrorHandler供参考:
Class ErrorHandler
{
public function __construct()
{
$this->register();
}
private function register()
{
register_shutdown_function( array($this, "handleFatalError") );
set_error_handler(array($this, "handlePhpError"));
set_exception_handler(array($this, "handleException"));
}
// Etc.
}
您必须在您的应用中注册特定的提供商:
https://github.com/whoops-php/silex-1
我知道 (b)
您可以完全禁用 Silex 应用程序错误处理程序的选项,之后,您的自定义错误处理程序应该可以像您定义的那样正常工作。
完全禁用 Silex 错误处理程序:
$app['exception_handler']->disable();
所以,它会像:
require_once 'Exception.php'; # Load the class
$handler = new ErrorHandler(); # Initialize/Register it
$app = new \Silex\Application();
$app->get('/', function () use ($app) {
nonexistentfunction();
trigger_error("example");
throw new \Exception("example");
});
$app->run();
看来,你还需要注册一个ExceptionHandler。 Silex 会将致命错误转为异常,以便对其进行处理。另外,如果我没记错的话,当 'thrown' 在控制器和中间件内部(至少在中间件之前)而不是在模型内部时,这种异常会被捕获。
最后,您可以添加以下内容来处理事情。
// register generic error handler (this will catch all exceptions)
$app->error(function (\Exception $e, $exceptionCode) use ($app) {
//if ($app['debug']) {
// return;
//}
return \Service\SomeHelper::someExceptionResponse($app, $e);
});
return $app;
希望对您有所帮助。
请注意 ExceptionHandler::disable() 已 deprecated in 1.3 and removed in 2.0。所以:
在 2.0 之前的 Silex 中:
$app['exception_handler']->disable();
在 Silex 2.0+ 中:
unset($app['exception_handler']);
我正在构建一个基于 Silex 1.3 的应用程序。这是我第一次接触Silex,所以不是很熟悉。
我想使用我自己的 error/exception 处理程序,它基本上是一个 class 注册自己,然后将捕获所有错误、致命错误和未捕获的异常并处理它们,要么在开发中使用 Whoops,或者在生产中使用优雅的处理程序。
但是,一旦我进入 silex 控制器、中间件等,Silex 将接管并使用它自己的错误处理。我的仍然会捕获致命错误,因为 Silex 显然不会关闭,但其他所有内容都被 Silex 的默认 "Something went wrong" 页面替换。
我知道我可以使用 $app->error() 来覆盖 Silex 处理错误的方式,但我还没有找到一种方法来从那里将事情设置回原来的 ErrorHandler,或者覆盖 WHETHER Silex处理错误。
那么,有谁知道如何 a) 使用 $app->error() 或其他方式告诉 Silex 使用我的错误处理程序,b) 完全禁用 Silex 中的错误处理,或 c) 作为最后的手段,让 Silex 捕获致命错误,这样我就可以在 $app->error()?
中处理所有三种类型由于这是我第一次使用 Silex,如果有更好的方法,请随时纠正我或告诉我您如何处理 Silex 中的错误,但如果可以的话,也请回答问题。
一些示例代码:
// This will register itself and then handle all errors.
$handler = new ErrorHandler();
// These are all handled appropriately.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
trigger_error("example"); // Correctly caught by ErrorHandler::handlePhpError
throw new \Exception("example"); // Correctly caught by ErrorHandler::handleException
$app = new \Silex\Application();
$app->get('/', function () use ($app) {
// This is still handled correctly.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
// However, these are now overridden by Silex.
trigger_error("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
throw new \Exception("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
});
$app->run();
还有一个非常简化的ErrorHandler供参考:
Class ErrorHandler
{
public function __construct()
{
$this->register();
}
private function register()
{
register_shutdown_function( array($this, "handleFatalError") );
set_error_handler(array($this, "handlePhpError"));
set_exception_handler(array($this, "handleException"));
}
// Etc.
}
您必须在您的应用中注册特定的提供商: https://github.com/whoops-php/silex-1
我知道 (b)
您可以完全禁用 Silex 应用程序错误处理程序的选项,之后,您的自定义错误处理程序应该可以像您定义的那样正常工作。
完全禁用 Silex 错误处理程序:
$app['exception_handler']->disable();
所以,它会像:
require_once 'Exception.php'; # Load the class
$handler = new ErrorHandler(); # Initialize/Register it
$app = new \Silex\Application();
$app->get('/', function () use ($app) {
nonexistentfunction();
trigger_error("example");
throw new \Exception("example");
});
$app->run();
看来,你还需要注册一个ExceptionHandler。 Silex 会将致命错误转为异常,以便对其进行处理。另外,如果我没记错的话,当 'thrown' 在控制器和中间件内部(至少在中间件之前)而不是在模型内部时,这种异常会被捕获。
最后,您可以添加以下内容来处理事情。
// register generic error handler (this will catch all exceptions)
$app->error(function (\Exception $e, $exceptionCode) use ($app) {
//if ($app['debug']) {
// return;
//}
return \Service\SomeHelper::someExceptionResponse($app, $e);
});
return $app;
希望对您有所帮助。
请注意 ExceptionHandler::disable() 已 deprecated in 1.3 and removed in 2.0。所以:
在 2.0 之前的 Silex 中:
$app['exception_handler']->disable();
在 Silex 2.0+ 中:
unset($app['exception_handler']);