Try/catch не работает в PHP
Почему я получаю эту ошибку?
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';
Разве try\catch не должен продолжать отмену кода? Или, может быть, есть какой-то другой способ сделать это?
Ответы
Ответ 1
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.
}
О, и лучше всего просмотреть Fatal Exceptions также полностью невозможно. Некоторые из них могут быть пойманы в некоторых случаях, но на самом деле вы хотите исправить фатальные ошибки, вы не хотите их обрабатывать.
Ответ 2
catch
не может получить фатальную ошибку.
Просто найдите timeout
в руководстве для file_get_contents, здесь есть несколько решений, вот один из них:
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1
)
)
);
file_get_contents("http://example.com/", 0, $ctx);
Ответ 3
try..catch
будет ловить исключения. Неустранимая ошибка не является исключением.
Если PHP превышает максимальное время выполнения, вы ничего не можете сделать. PHP просто останавливается. То же самое, если у PHP заканчивается память: ничего не поделаешь, чтобы исправить это после того, как это произошло.
Другими словами, исключения - это ошибки, из которых вы можете потенциально восстановить. Неустранимая ошибка, ну, фатальная и невосстановимая.
Ответ 4
В PHP фатальная ошибка остановит выполнение script. Есть способы сделать что-то, когда вы сталкиваетесь с ними, но идея фатальной ошибки заключается в том, что его не следует улавливать.
Ответ 5
Вот несколько хороших деталей: 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/С# из-за "после факта" ее характера.
Ответ 6
file_get_contents
не генерирует исключение (и, следовательно, ошибки и предупреждения, которые он бросает, не увлекательны). Вы получаете предупреждение PHP, а затем фатальную ошибку, которая объясняет вам, почему script не продолжается - он превысил лимит для загрузки сценариев, установленных в php.ini
.
Ответ 7
Неустранимые ошибки в PHP не пойманы. Обработка ошибок и обработка исключений - это две разные вещи. Однако, если вы склонны справляться с фатальными ошибками в качестве исключения, вам нужно будет настроить свой собственный обработчик ошибок и направить на него все ошибки, сделать обработчик ошибок для исключения ошибок, и вы сможете их поймать.