Как обработать ошибку fsockopen в PHP?

#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;
}