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

dar*_*ong 10 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.");
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试为测试提供不存在的文件时,我收到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
Run Code Online (Sandbox Code Playgroud)

我想知道我是否遗漏了一些非常明显的东西.

我已经检查了这个问题PHP致命错误:未捕获异常'异常'的消息,但它不太像我的问题,并没有简明的答案.

请帮忙?

*编辑*

这似乎与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/

Ora*_*ill 22

对于display_errors关闭的未捕获异常,这是预期的行为.

你在这里的选择是通过php或ini文件打开display_errors或捕获并输出异常.

 ini_set("display_errors", 1);
Run Code Online (Sandbox Code Playgroud)

要么

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

如果你抛出异常,那么意图就是在某个地方进一步发现某些东西将会捕获并处理它.如果不是,则是服务器错误(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");
Run Code Online (Sandbox Code Playgroud)


xor*_*zor 9

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

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

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

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