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

我正在构建基于Silex 1.3的应用程序.这是我第一次与Silex碰面,所以我对此不太熟悉.

我想使用自己的错误/异常处理程序,它基本上是一个注册自身的类,然后将捕获所有错误,致命错误和未捕获的异常并通过开发中的Whoops或生产中的优美处理程序来处理它们.

但是,一旦我进入了Silex控制器,中间件之内,无论什么东西,Silex都会接管并使用它自己的错误处理.我的仍然会遇到致命的错误,因为Silex显然不会陷入关机状态,但是其他所有内容都被Silex的默认“发生了问题”页面代替.

我确实知道我可以使用$app-> error()覆盖Silex如何处理错误,但是我还没有找到一种方法可以将事情从那里设置回原始的ErrorHandler或覆盖WHETHER 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.

}

解决方法:

我知道选项(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();
上一篇:python-nginx / gunicorn Django Rest Framework应用程序的端口代理


下一篇:Javascript框架之间的速度测试可靠吗?