【问题标题】:Symfony2 catch PDO errors when booting KernelSymfony2 在启动内核时捕获 PDO 错误
【发布时间】:2014-09-27 04:04:12
【问题描述】:

我正在使用 Symfony 2.4 并试图创建一个更强大的异常处理程序,在某些 PDO / Doctrine 异常上,将响应的状态代码从 500 更改为 503 以显示与我们的标准不同的自定义错误消息(在换句话说,它返回 error503.html.twig 模板而不是 error500.html.twig)。到目前为止,我已经创建了一个扩展 TwigBundle ExceptionController 的自定义异常控制器,我已经更改了 config.yml 中的 Twig 异常参数,并且我能够捕获一旦 Symfony 在 HttpKernel 中调用 handle(...) 时引发的任何和所有异常。 php:185(所以这实际上是第二次调用 handle ——这次是在 HttpKernel 而不是 AppKernel 上)。我将避免发布所有这些代码,而是指示读者here 了解更多关于我的方法的信息,如果他们不熟悉的话。所有这些代码都工作得很好——我可以修改我的应用程序中抛出的任何应用程序,所以你可以假设我正确地使用了上述方法。

我遇到的问题是,除了捕获 Symfony 中抛出的异常之外,我还希望能够捕获在调用 HttpKernel 的 handle 方法之前抛出的异常(例如 PDO不正确的数据库凭据引发的访问被拒绝异常)。为了给你一个更具体的纲要,在app_dev.php,你有:

$response = $kernel->handle($request);

调用:

/**
 * {@inheritdoc}
 *
 * @api
 */
public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
    if (false === $this->booted) {
        $this->boot();
    }

    return $this->getHttpKernel()->handle($request, $type, $catch);
}

现在,如果在$this->boot() 中抛出异常,它看起来不会在任何地方被捕获,因此,我看不到任何在 Symfony 中优雅地处理所述异常的方法。只有在 $this->getHttpKernel()->handle($request, $type, $catch) 中包含的 try / catch 块中抛出异常时,它才会被捕获并使用 Symfony 代码优雅地处理。我错了吗?有谁知道使用 Symfony 处理在此上下文中抛出的异常的方法?如果这已经在其他地方得到回答,我提前道歉。

【问题讨论】:

    标签: php symfony exception pdo


    【解决方案1】:

    我遇到了类似的问题,我没有看到解决此问题的简洁方法,但只需生成一个响应对象并发送它,就能够为我的特定问题获得很好的错误页面。我将以下内容放在 boot() 调用的一些代码中

    try {
        someExceptionFunction();
    } catch (Exception $e) {
        $response = new Response('<html><body>'.$e->getMessage().'</body></html>');
        $response->send();
        exit;
    }
    

    您可以轻松地向 catch 块添加更多逻辑,捕获不同的异常。它不像它可能的那样干净/抽象,但由于整个框架无法启动,我不知道有什么选项可以用来解析错误页面。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2018-08-18
      • 2014-10-09
      • 2014-05-21
      • 2022-01-10
      • 2018-04-26
      • 2019-10-31
      相关资源
      最近更新 更多