用于生产的PHP转义错误@

时间:2015-05-18 07:19:22

标签: php escaping fsockopen

我想逃避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.

2 个答案:

答案 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 {
  ...
}

我认为如果您正在处理故障情况,那么使用@有意识地抑制警告就可以了。