我们正在生产几个symfony2网站,我们正在使用Airbrake和Sentry来收集异常。即使在生产中,真正的异常也能很好地工作,我们可以用很多上下文记录它们,我们可以向用户显示一个不错的500错误页面。
PHP错误是另一回事。我可以使用“on shutdown”处理程序将它们记录到Sentry,但是使用它我不能传递很多上下文。对于用户,也只有空503错误。这很糟糕,因为如果出现问题,我们无法向用户显示“下一步”。
来自Java背景我非常喜欢“真正的”异常,并且在开发模式中有一个类可以在异常中转换大量错误,但是没有记录或明显的方法在生产中启用它,所以我想也许我不应该再问一些问题;)
你们是如何处理这个问题的?它会带来什么样的性能损失?
这是来自http://groups.google.com/group/symfony2/browse_thread/thread/6129f57a35d8cb90?hl=en
的交叉点答案 0 :(得分:9)
启用此功能的PHP方式:
错误(bootstrap!):
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);
}
异常(ExceptionHandler类):
set_exception_handler(array($this, 'exception'));
public function exception(\Exception $e) {
$this->logger->log($e);
}
致命错误(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™”ErrorHandling应保持不变。
答案 1 :(得分:1)
在Symfony2中,我们可以引入Error / Exception监听器服务(捕获所有错误),on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on on
答案 2 :(得分: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();
[...]
答案 3 :(得分:0)
您可以为某些内核事件添加事件处理程序(Exception,OnResponse ....)