我想逃避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.
答案 0 :(得分:0)
使用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!';
答案 1 :(得分:-1)
您可以在生产系统中禁用通知和警告(而不是写入日志):
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 {
...
}
我认为如果您正在处理故障情况,那么使用@有意识地抑制警告就可以了。