【问题标题】:PHP Fatal error: Uncaught exception 'Exception'PHP 致命错误:未捕获的异常“异常”
【发布时间】:2013-07-07 12:20:00
【问题描述】:

我正在玩 PHP 中的异常。例如,我有一个读取 $_GET 请求并加载文件的脚本;如果文件不存在,应该抛出一个新的异常:

if ( file_exists( $_SERVER['DOCUMENT_ROOT'] .'/'.$_GET['image'] ) ) {
    // Something real amazing happens here.
}
else {
    throw new Exception("The requested file does not exists.");
}

问题是,当我尝试为测试提供一个不存在的文件时,我得到了 500 错误而不是异常消息。服务器日志如下:

[09-Jul-2013 18:26:16 UTC] PHP Fatal error:  Uncaught exception 'Exception' with message 'The requested file does not exists.' in C:\sites\wonderfulproject\script.php:40
Stack trace:
#0 {main}
  thrown in C:\sites\wonderfulproject\script.php on line 40

我想知道我是否在这里遗漏了一些非常明显的东西。

我已经检查了这个问题PHP fatal error: Uncaught exception 'Exception' with message,但这与我的问题不太一样,并且没有简明的答案。

请帮忙?

* 编辑 *

这似乎与throw 关键字有关。例如,如果我使用echo,我会在屏幕上打印出消息,如下所示:

异常“异常”,带有消息“文件不存在”。在 C:\sites\wonderfulproject\script.php:183 堆栈跟踪:#0 {main}

这是为什么呢?

** 编辑 2 **

感谢@Orangepill,我对如何处理异常有了更好的了解。我从 nettuts 中找到了一个非常棒的 tut,它很有帮助。链接:http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

【问题讨论】:

  • 您的日志准确地告诉您您希望它告诉您的内容,问题是什么?
  • file_exists 显然返回了false,可能是因为该文件实际上存在。
  • @DanyCaissy 问题是我收到 500 - 内部服务器错误,而不是我的消息和屏幕中的堆栈跟踪出现异常。
  • 请注意路径遍历攻击!

标签: php exception throw


【解决方案1】:

这是关闭 display_errors 的未捕获异常的预期行为。

您的选择是通过 php 或在 ini 文件中打开 display_errors 或捕获并输出异常。

 ini_set("display_errors", 1);

 try{
     // code that may throw an exception
 } catch(Exception $e){
     echo $e->getMessage();
 }

如果您抛出异常,其目的是在更远的地方捕获并处理它。如果不是,则为服务器错误 (500)。

您的另一个选择是使用set_exception_handler 为您的脚本设置默认错误处理程序。

 function default_exception_handler(Exception $e){
          // show something to the user letting them know we fell down
          echo "<h2>Something Bad Happened</h2>";
          echo "<p>We fill find the person responsible and have them shot</p>";
          // do some logging for the exception and call the kill_programmer function.
 }
 set_exception_handler("default_exception_handler");

【讨论】:

  • 不错。但我认为我可以在 try catch 块之外抛出异常,如果我错了,请纠正我。我已经用我尝试过的新描述更新了我的问题。
  • 你可以......但你会收到一条 500 条服务器消息:)......除了让自己有机会捕捉和处理它之外,抛出异常是没有意义的,或者在如果异常不可恢复,请至少为最终用户格式化一个信息丰富的“oops”页面。
  • try/catch 不必在抛出异常的函数中,它也可以在执行堆栈的更下方...就像在那个函数的调用者中,或者那个函数'来电者。
  • @darksoulsong 更新了答案以显示使用 set_exception_handler 创建口袋妖怪异常处理程序(必须全部捕获)来处理那些潜入 try/catch 块的异常。
【解决方案2】:

只是在这里添加一些额外的信息,以防有人和我有同样的问题。

我在我的代码中使用命名空间,并且我有一个带有抛出异常的函数的类。

但是,我在另一个类文件中的 try/catch 代码被完全忽略,并且抛出了未捕获异常的正常 PHP 错误。

原来我忘了添加“use \Exception;”在顶部,添加解决了错误。

【讨论】:

  • 或者你可以在类的调用中定义路径: throw new \Exception(...);注意前面的“\”来定义根类的路径。
  • 感谢@xorinzor 解决了我的问题!我快要疯了……
【解决方案3】:

对于

throw new Exception('test exception');

我得到了 500(但在浏览器中没有看到任何东西),直到我放

php_flag display_errors on

在我的 .htaccess 中(仅用于子文件夹)。 还有更详细的设置, 见Enabling error display in php via htaccess only

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2023-03-18
    • 1970-01-01
    • 2015-06-10
    • 2015-06-20
    相关资源
    最近更新 更多