php - 在异常处理程序中抛出异常

标签 php exception exception-handling error-handling

我有一个带有异常处理程序的脚本。在异常后脚本退出之前,此异常处理程序会清理几个连接。

我想从这个异常处理程序中重新抛出异常,以便它由 PHP 自己的最后手段异常处理程序处理,其中错误被写入 PHP 的错误日志,或者任何默认值,如 PHP 中配置的那样.ini.

不幸的是,这似乎不太可能,如下所述:

http://www.php.net/manual/en/function.set-exception-handler.php#68712

Will cause a Fatal error: Exception thrown without a stack frame

是否有另一种方法可以将错误冒泡到堆栈中,以便 PHP 在我的异常处理程序完成清理后处理它?<​​/p>

最佳答案

您不能从异常处理程序中重新抛出,但是,您可以在其他地方抛出。例如,您可以通过将事物封装到它自己的类中,然后使用 __destruct() 函数(PHP 5.3,Demo),将重新抛出与处理程序分离:

<?php

class ExceptionHandler
{
    private $rethrow;
    public function __construct()
    {
        set_exception_handler(array($this, 'handler'));
    }
    public function handler($exception)
    {
        echo  "cleaning up.\n";
        $this->rethrow = $exception;
    }
    public function __destruct()
    {
        if ($this->rethrow) throw $this->rethrow;
    }
}

$handler = new ExceptionHandler;

throw new Exception();

将其放入我的错误日志中:

[29-Oct-2011 xx:32:25] PHP Fatal error: Uncaught exception 'Exception' in /.../test-exception.php:23
Stack trace:
#0 {main}
thrown in /.../test-exception.php on line 23

关于php - 在异常处理程序中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856173/

相关文章:

php - jQuery 电子邮件没有文本/提交两次

php - 同步网页

ios - xCode - 来自苹果崩溃报告服务的崩溃报告的异常原因

.net - 为什么 .NET 异常是可变的?

php - 为什么它不能只突出显示新数据?

php - 如何避免多次重新加载 XML 文档?

java - Go 的等价于 'throws' 的子句是什么?

c# - 重新抛出 ex.InnerException 是个坏主意?

c# - 从 Linq 查询异常中抛出异常

c# - 避免多次 try catch