Я хочу избежать ошибки, сгенерированной fsockopen
и это работает так.
if ($fp = @fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)) { //... }
но я пробовал другие вещи, чтобы избежать @
и мне не удалось.
Есть ли код, который я могу использовать, который эквивалентен этому?
Я попробовал также что-то вроде этого только для целей тестирования:
try{
if ($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)) {
/...
}
//..
} catch (Exception $e){
echo 'Error';
}
Это не работает.
Warning: fsockopen(): unable to connect to localhost:79 (A connection
attempt failed because the connected party did not properly respond after a period of time or established
connection failed because connected host has failed to respond.
использование set_error_handler()
преобразовать все ошибки в исключение, которое вы можете отловить впоследствии:
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
if(0 === error_reporting())
return false;
throw new PHPException($errno, $errstr, $errfile, $errline, $errcontext);
});
Так что теперь вы можете поймать ошибку PHP:
try {
if ($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)) {
//...
}
//..
} catch (\Exception $e){
echo 'Connection failed: ' , $e->getMessage();
}
echo 'Don\'t worry... go on!';
Вы можете отключить уведомления и предупреждения в производственных системах (вместо записи в журнал):
error_reporting(E_ERROR);
В средах разработки вы, вероятно, захотите, чтобы все ошибки, уведомления и предупреждения касались:
error_reporting(E_ALL);
проверьте уровни сообщений об ошибках здесь: http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting
РЕДАКТИРОВАТЬ: Чтобы проверить на наличие ошибок:
$fp = @fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
...
}
Я думаю, что если вы работаете со сценариями сбоев, то сознательное подавление предупреждения с помощью @ — это нормально.