无法捕获异常并如何取消异常处理程序

3

catch不起作用是因为使用set_exception_handler()安装了异常处理程序。

我需要让“catch”起作用,所以我猜我需要以某种方式取消异常处理程序。像set_exception_handler(NULL)之类的东西都不起作用。

有什么办法可以取消异常处理程序吗?

function my_exception_handler($exception) {
    error_log("caught exception: " . $exception->getMessage() );
}

set_exception_handler("my_exception_handler");

// QUESTION: how does on unset it ?
//set_exception_handler(NULL);

try {
    throw new Exception('hello world');
    error_log("should not happen");
} catch(Exception $e) {
    error_log("should happen: " . $e->getMessage());
}

实际输出:

捕获异常: hello world

期望输出:

应该发生: hello world


1
我刚刚尝试了你的代码,将 error_log 替换为 print,结果我得到了 "should happen: hello world"。你的服务器配置有什么特别之处吗? - Arkh
我不知道该找什么。而且我现在不在工作岗位上,所以无法浏览它。 - neoneye
2个回答

7

需要翻译的内容:

restore_exception_handler是从set_exception_handler手册条目中链接出来的。这些异常处理程序只有在没有捕获到异常时才会发挥作用。catch块应始终优先考虑。


Exceptions页面的评论中可以了解到此错误此错误。它们描述了您的经历,即当定义自定义错误处理程序时无法捕获异常。

解决方案:

在5.3和HEAD中修复,不会返回到5.2。


插入 restore_exception_handler() 并不能解决问题。现在我看到了一个 PHP 致命错误:在 /long/path/to/phpfile 中抛出未捕获的异常 'Exception',消息为 'hello world'。我该如何捕获这个异常? - neoneye
你发布的代码是唯一正在运行的代码吗?当我运行那段代码时,它可以正常工作。 - webbiedave
我正在使用TYPO3,它安装了自己的异常处理程序和错误处理程序。然而,我需要暂时绕过这些处理程序,以便“catch”可以工作,这样我就可以确定在合并两个PDF文件时是否存在问题。在这里,我需要throw/catch正常工作。否则,我需要修改TCPDF。 - neoneye
1
@neoneye:你为什么相信 set_exception_handler 会覆盖 catches 呢?那不是它的行为。我认为你的问题出在其他地方。 - webbiedave
你的TYPO3配置中关于异常和错误处理方面是怎样的? - Arkh
显示剩余9条评论

0
该函数是restore_exception_handler。然而,只有在异常未被处理时才应调用处理程序。它不会禁用catches。

这并没有解决我的特定问题,请查看@deceze帖子下的回复。 - neoneye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接