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

时间:2016-04-09 03:28:19

标签: php symfony error-handling frameworks silex

我正在构建一个基于Silex 1.3的应用程序。这是我第一次遇到Silex,所以我对它并不熟悉。

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

然而,一旦我进入一个silex控制器,中间件,无论如何,Silex将接管并使用它自己的错误处理。我仍然会捕获致命的错误,因为Silex显然没有挂机关闭,但其他一切都被Silex默认的“Something going wrong”页面取代。

我知道我可以使用$ app-> error()来覆盖Silex如何处理错误,但是我没有找到一种方法从那里将东西设置回原始的ErrorHandler,或者覆盖WHETHER Silex句柄错误。

那么,有没有人知道如何a)告诉Silex使用我的错误处理程序,使用$ app-> error()或其他方式,b)完全禁用Silex中的错误处理,或c )作为最后的手段,让Silex捕获致命的错误,以便我可以在$ app-> error()中处理所有三种类型?

由于这是我第一次使用Silex,如果有更好的方法,请随时纠正我或告诉我如何处理Silex中的错误,但如果可以,请同时回答这个问题。 < / p>

一些示例代码:

// 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.

}

3 个答案:

答案 0 :(得分:3)

请注意,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']);

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

您必须在应用中注册特定提供商: https://github.com/whoops-php/silex-1