PHP致命错误:未捕获异常'异常'

时间:2013-07-09 18:49:34

标签: php exception throw

我正在玩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中找到了一个很棒的啧啧,这帮助了很多。链接:http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

3 个答案:

答案 0 :(得分:22)

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

这里的选项是通过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");

答案 1 :(得分:9)

如果有人遇到与我相同的问题,请在此处添加一些额外信息。

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

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

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

答案 2 :(得分:0)

对于

throw new Exception('test exception');

我得到500(但在浏览器中没有看到任何内容),直到我把

php_flag display_errors on

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