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

5
我正在构建一个基于Silex 1.3的应用程序。这是我第一次接触Silex,所以我对它不是很熟悉。
我想使用自己的错误/异常处理程序,它基本上是一个注册自身的类,然后将捕获所有错误、致命错误和未捕获的异常并处理它们,在开发中使用Whoops,在生产中使用优雅的处理程序。
但是,一旦我进入Silex控制器、中间件或其他任何东西,Silex就会接管并使用自己的错误处理。我的处理程序仍然会捕获致命错误,因为Silex显然没有挂钩到关闭,但是除此之外,一切都被Silex的默认“出了点问题”的页面替换了。
我确实理解我可以使用$app->error()来覆盖Silex如何处理错误,但我还没有找到一种方法从那里将事情设置回原始的ErrorHandler,或者覆盖Silex是否处理错误。
因此,有人知道如何a)告诉Silex使用我的错误处理程序,使用$app->error()或其他方式,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.

}
4个回答

3

我知道你可以选择(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();

$app['exception_handler']->disable(); 谢谢!这正是我需要的。有趣的是,现在你给了我,我能在API中找到它。但愿他们的文档能更好些 =o) - Eli

3
请注意,ExceptionHandler::disable()在1.3版本中已被弃用,并在2.0版本中已被移除。因此:
在Silex 2.0之前:
$app['exception_handler']->disable();

在 Silex 2.0+ 中:
unset($app['exception_handler']);

2
看到Silex doc
看起来,你需要注册一个ExceptionHandler。为了处理致命错误,Silex会将它们转换为异常。此外,如果我记得正确的话,在控制器和中间件(至少在中间件之前)中,“抛出”这种类型的异常时,将会被捕获,但在模型中不会被捕获。
最后,你可以添加以下内容来处理事情。
// 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;

我希望那有点帮助。

-3

兄弟,认真点。你有没有读问题?我是指甚至只读了问题的标题?仅仅是标题。 - Eli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接