4

我们在生产中运行了几个 symfony2 网站,我们同时使用 Airbrake 和 Sentry 来收集异常。真正的异常即使在生产中也能很好地工作,我们可以用大量的上下文记录它们,我们可以向用户展示一个漂亮的 500 错误页面。

PHP 错误是另一回事。我可以使用“关闭时”处理程序将它们记录到 Sentry,但是使用它我无法传递很多上下文。对于用户来说,也只有一个空的 503 错误。这很糟糕,因为如果出现问题,我们无法向用户显示“下一步”。

来自 Java 背景,我非常喜欢“真正的”异常,在开发模式下,有一个类可以转换异常中的许多错误,但是没有记录或明显的方法可以在生产中启用它,所以我想也许我应该' t 在询问更多信息之前;)

你们是如何处理这个问题的,这会带来什么样的性能损失?

这是来自:http ://groups.google.com/group/symfony2/browse_thread/thread/6129f57a35d8cb90?hl=en

4

4 回答 4

9
  • 您应该将所有“错误”作为例外处理
  • 您应该发送正确的 http 标头代码并在网络服务器中拦截此 http 错误代码:http ://wiki.nginx.org/HttpFastcgiModule#fastcgi_intercept_errors (apache 中也有类似的内容)
  • 您只需要关闭处理程序来记录“致命”的事情
  • “关闭功能”中的“上下文”不受限制(如果您在错误之前“分配”它!)
  • 最好的优化是不犯错误;)

启用此功能的 PHP 方式:

  1. 错误(引导程序!):

    set_error_handler('errorToException');
    
    function errorToException($code, $message, $file = null, $line = 0) {
        if (error_reporting() == 0) {
            return true;
        }
        throw new \ErrorException($message, $code, $file, $line);
    }
    
  2. 异常(ExceptionHandler 类):

    set_exception_handler(array($this, 'exception'));
    
    public function exception(\Exception $e) {
        $this->logger->log($e);
    }
    
  3. 致命错误(ExceptionHandler 类):

    register_shutdown_function(array($this, 'shutdown'));
    
    public function shutdown() {
        $error = error_get_last();
        if (isset($error)) {
            $this->exception(new \FatalException($error['message'], $error['type'],     $error['file'], $error['line']));
        }
    }
    

这是-PHP-way™。你所有的“Symfony2™”错误处理应该保持不变。

于 2012-05-14T20:09:52.783 回答
1

在 Symfony2 中,我们可以引入错误/异常侦听器服务(它捕获所有错误),并且在 onKernelException() 中我们可以包含我们所有的域逻辑来处理错误/异常。

于 2013-10-30T12:41:55.567 回答
1

假设你至少使用 Symfony 2.3 有一个新的机制。

use Symfony\Component\Debug\ErrorHandler;

require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';

// we need to register the Error Handler in order
// to get fatal errors delivered as Exceptions
ErrorHandler::register();

[...]
于 2014-03-27T16:50:23.913 回答
0

您可以将事件处理程序添加到某些内核事件(异常,OnResponse ....)

于 2012-09-06T12:24:56.173 回答