【问题标题】:Catch not working and how to unset the exception handler捕获不起作用以及如何取消设置异常处理程序
【发布时间】:2011-02-12 10:45:52
【问题描述】:

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

期望的输出:

应该发生:你好,世界

【问题讨论】:

  • 我刚刚尝试了用 print 替换 error_log 的代码,我得到“应该发生:你好世界”。您的服务器配置有什么特别之处吗?
  • 我不知道该寻找什么。而且我现在不在工作,所以我无法凝视它。

标签: php exception try-catch


【解决方案1】:

restore_exception_handler,链接自 set_exception_handler 的手动条目。

顺便说一句,这些异常处理程序应该只在异常未捕获时发挥作用。 catch 块应始终具有优先权。


阅读 Exceptions 页面上的 cmets 会带您到 this bugthis bug。它们准确描述了您的体验,定义自定义错误处理程序时无法捕获异常。

解决方案:

在 5.3 和 HEAD 中修复,不会向后移植到 5.2。

【讨论】:

  • 插入 restore_exception_handler() 并不能解决它。现在我看到一个 PHP 致命错误:在 /long/path/to/phpfile 中未捕获异常 'Exception' 并带有消息 'hello world'。如何捕获此异常?
  • 您发布的代码是唯一正在运行的代码吗?当我运行该代码时,它工作正常。
  • 我正在使用 TYPO3,它安装了自己的异常处理程序和错误处理程序。但是我需要暂时绕过这些处理程序,以便“catch”可以工作,这样我就可以确定合并两个 PDF 文件时是否有问题。在这里,我需要 throw / catch 才能工作。否则我需要修改 TCPDF。
  • 我在 Mac OS X 10.6 上使用 PHP 5.2.3 版。
  • @neoneye:为什么你认为 set_exception_handler 会覆盖捕获?那不是它的行为。我相信您的问题出在其他地方。
【解决方案2】:

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

【讨论】:

  • 这并不能解决我的特定问题,请参阅@deceze 帖子的回复。
猜你喜欢
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多