gpt4 book ai didi

php - 我可以在 Silex 中禁用错误​​/异常处理吗?

转载 作者:可可西里 更新时间:2023-11-01 00:41:14 24 4
gpt4 key购买 nike

我正在构建一个基于 Silex 1.3 的应用程序。这是我第一次接触Silex,所以不是很熟悉。

我想使用我自己的错误/异常处理程序,它基本上是一个注册自身的类,然后将捕获所有错误、 fatal error 和未捕获的异常并处理它们,或者使用开发中的 Whoops,或者优雅的生产中的处理程序。

但是,一旦我进入 silex Controller 、中间件等,Silex 将接管并使用它自己的错误处理。我的仍然会捕获 fatal error ,因为 Silex 显然没有 Hook 到关机状态,但其他所有内容都被 Silex 的默认“出错了”页面替换。

我知道我可以使用 $app->error() 来覆盖 Silex 处理错误的方式,但我还没有找到一种方法来从那里将事情设置回原来的 ErrorHandler,或者覆盖 Silex 处理错误的方式.

那么,有没有人知道如何 a) 使用 $app->error() 或其他方式告诉 Silex 使用我的错误处理程序,b) 完全禁用 Silex 中的错误处理,或者 c)作为最后的手段,让 Silex 捕获 fatal error ,这样我就可以在 $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.

}

最佳答案

我知道 (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();

关于php - 我可以在 Silex 中禁用错误​​/异常处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36512380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com