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)
只是在这里添加一些额外的信息,以防有人和我有同样的问题.
我在我的代码中使用命名空间,并且我有一个带有抛出异常的函数的类.
但是,我在另一个类文件中的try/catch代码被完全忽略,并且抛出了未捕获异常的正常PHP错误.
原来我忘记添加"use\Exception;" 在顶部,添加解决了错误.