try / catch не работает в PHP - PullRequest
15 голосов
/ 31 июля 2011

Почему я получаю эту ошибку?

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';

Разве попытка \ отлов не должна продолжать выполнение кода? Или, может быть, есть другой способ сделать это?

Ответы [ 7 ]

14 голосов
/ 31 июля 2011

try ... catch больше для исключений нулевых объектов и исключений, создаваемых вручную.Это действительно не та парадигма, которую вы можете увидеть в Java.Предупреждения почти вводят в заблуждение тем, что они специально игнорируют блоки try ... catch.

Чтобы подавить предупреждение, добавьте к методу вызова метода (или доступа к массиву) @.

* 1005.*

О, и лучше всего посмотреть, что Фатальные Исключения также совершенно не поддаются отслеживанию.Некоторые из них могут быть обнаружены при некоторых обстоятельствах, но на самом деле вы хотите исправить фатальные ошибки, вы не хотите обрабатывать их.

5 голосов
/ 31 июля 2011

catch не может поймать фатальную ошибку.

Просто найдите timeout в руководстве по file_get_contents , здесь есть несколько решений, вот одно:

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx); 
2 голосов
/ 31 июля 2011

Вот несколько полезных деталей: http://pc -technic.blogspot.com / 2010/10 / php-filegetcontents-exception-processing.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 # из-за природы "после факта".

2 голосов
/ 31 июля 2011

В PHP фатальная ошибка остановит выполнение скрипта. Есть способы сделать что-то, когда вы столкнетесь с ними , но идея фатальной ошибки заключается в том, что это не должно быть перехвачено .

2 голосов
/ 31 июля 2011

try..catch будет ловить только исключения . Неустранимая ошибка не является исключением.

Если PHP превышает максимальное время выполнения, вы ничего не можете сделать. PHP просто останавливается. То же самое, если PHP не хватает памяти: вы ничего не можете сделать, чтобы это исправить после того, как это произошло.

Другими словами, исключения - это ошибки, которые вы потенциально можете исправить. Фатальные ошибки, ну, фатальные и неустранимые.

1 голос
/ 31 июля 2011

file_get_contents не выдает исключение (и, следовательно, ошибки и предупреждения, которые оно выдает, не перехватывается).Вы получаете предупреждение PHP, а затем фатальную ошибку, которая объясняет, почему скрипт не продолжается - он превысил предел для загрузки скриптов, установленный в php.ini.

1 голос
/ 31 июля 2011

Фатальные ошибки в PHP не улавливаются. Обработка ошибок и обработка исключений - две разные вещи. Однако, если вы одержимы обработкой фатальных ошибок в качестве исключения, вам нужно будет настроить собственный обработчик ошибок и направить на него все ошибки, заставить обработчик ошибок генерировать исключения, и вы сможете их перехватывать.

...