我正在玩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/
答案 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