#php #error-handling #cron
#php #обработка ошибок #cron
Вопрос:
try {
$fp = fsockopen($site, $port, $errno, $errstr, 2);
}
catch(Exception $ex) {
echo 'error';
}
Почему catch
не работает, пока я вижу, что предупреждения выдаются для fsockopen
Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: No such host is known.
и
Warning: fsockopen(): unable to connect to www.myrandsitedf.net:80 (php_network_getaddresses: getaddrinfo failed: No such host is known. )
Я знаю, что я могу использовать @
для подавления сообщений об ошибках / предупреждениях, но я не думаю, что это правильный способ обработки ошибки.
Кроме того, Cronjob на моем хосте не разрешает файлы PHP с ошибками в нем, @
не решает проблему.
Комментарии:
1. потому что процедурные функции PHP НИКОГДА не генерируют исключения. Они возвращают логическое значение false при сбое. Если функции внезапно начнут выдавать исключения, это приведет к поломке каждого отдельного «старого» скрипта, написанного с использованием методологии fail-by-boolean. Точно так, как задокументировано :
If the call fails, it will return FALSE
Ответ №1:
Вы должны использовать исключение с глобальным пространством имен.
Попробуйте этот код:
try {
$fp = fsockopen($site, $port, $errno, $errstr, 2);
}
catch(Exception $ex) { //used back-slash for global namespace
echo 'error';
}
Это будет работать в php 5.3 или более поздней версии.
Спасибо.
Ответ №2:
Вы должны сделать разницу между exceptions
и errors
. Если вы хотите, чтобы ошибки (предупреждения и т. Д.) Были преобразованы в исключение, чтобы их можно было перехватить в catch, вы должны зарегистрировать a error_handler
, который преобразует ошибку в исключение:
function error_handler($errno, $errstr, $errfile, $errline)
{
if( ($errno amp; error_reporting()) > 0 )
throw new ErrorException($errstr, 500, $errno, $errfile, $errline);
else
return false;
}
set_error_handler('error_handler');
Комментарии:
1. Как бы я использовал это в моем примере выше? Я совсем новичок в PHP, если
warnings
я хочу, чтобы скрипт продолжался, а не останавливался,@
для меня это не помогает.2. Если вы хотите игнорировать предупреждения, это другая история. Используйте
error_reporting(0)
функцию, как описано в php.net/manual/en/function.error-reporting.php но в любом случае текущее предупреждение сообщает вам, что хост не найден, так что вы все равно не сможете продолжить
Ответ №3:
Простой и правильный способ сделать это
try {
$fp = @fsockopen($ip, $port, $errno, $errstr, 5);
@fclose($fp);
return true;
} catch (Exception $th) {
// return "error";
return $th;
}