try / catch在PHP中不起作用

时间:2011-07-31 17:09:54

标签: php try-catch

为什么我收到此错误?

Warning: file_get_contents(http://www.example.com) [function.file-get-contents]: failed to open stream: HTTP request failed! in C:\xampp\htdocs\test.php on line 22

Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\test.php on line 22

以下是代码:

 try {
    $sgs = file_get_contents("http://www.example.com");
 }
 catch (Exception $e) {
    echo '123';
 }
 echo '467';

是不是尝试\ catch应该继续执行代码?或者可能有一些不同的方法来做到这一点?

7 个答案:

答案 0 :(得分:14)

try ... catch更多用于空对象异常和手动抛出异常。它实际上与您在Java中看到的范式不同。警告几乎具有欺骗性,因为它们会特别忽略try ... catch块。

要禁止警告,请使用@为方法调用(或数组访问)添加前缀。

 $a = array();
 $b = @$a[ 1 ]; // array key does not exist, but there is no error.

 $foo = @file_get_contents( "http://somewhere.com" );
 if( FALSE === $foo ){ 
     // you may want to read on === there;s a lot to cover here. 
     // read has failed.
 }

哦,最好是查看致命异常也是完全无法捕获的。其中一些可以在某些情况下被捕获,但实际上,您希望 修复 致命错误,您不希望处理它们。

答案 1 :(得分:5)

catch无法发现致命错误。

只需在file_get_contents手册中搜索timeout,其中列出了几个解决方案,其中一个是:

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx); 

答案 2 :(得分:2)

try..catch只会捕获例外。致命错误也不例外。

如果PHP超过其最大执行时间,则无法执行任何操作。 PHP简直就是停止了。如果PHP内存耗尽,情况就是这样:在发生事件后你无法修复它。

换句话说,例外是您可以从中恢复的错误。致命错误是致命的,不可恢复的。

答案 3 :(得分:2)

在PHP中,致命错误将停止脚本的执行。 There are ways to do something when you run into them,但致命错误的想法是it should not be caught

答案 4 :(得分:2)

以下是一些很好的细节:http://pc-technic.blogspot.com/2010/10/php-filegetcontents-exception-handling.html

基本上更改代码以执行以下操作:

try {
    @$sgs = file_get_contents("http://www.example.com"); 
    if ($sgs == FALSE)
    {
       // throw the exception or just deal with it
    }
} catch (Exception $e) {
    echo '123'; 
}
 echo '467';

请注意使用'@'符号。这告诉PHP忽略该特定代码引发的错误。 PHP中的异常处理与java / c#非常不同,因为它具有“事后”性质。

答案 5 :(得分:1)

未捕获PHP中的致命错误。错误处理和异常处理是两回事。但是,如果您一心想将致命错误视为异常,则需要设置自己的错误处理程序并将所有错误指向它,使错误处理程序抛出异常,然后您可以捕获它们。

答案 6 :(得分:1)

file_get_contents不会抛出异常(因此它抛出的错误和警告不会被捕获)。您正在收到PHP警告,然后是致命错误,这解释了脚本无法继续的原因 - 它超出了加载php.ini中设置的脚本的限制。