试试{inet_ntop($ row [' ip'])...}在PHP中捕捉{gracefully}

时间:2011-07-05 01:37:19

标签: php try-catch ipv6

我正在使用从MySQL数据库打印地址的表。我不确定我是否理解try / catch块。旧记录没有IP地址,但新记录在表中有IP地址。新的记录(带有IP地址)打印出来的很好,但只有当我把它放在如下的try catch中时:

try {
   echo inet_ntop($row['ip']);
}
catch (Exception $e){
  //echo 'Exception caught: ',  $e->getMessage(), "\n";
            echo "n/a";
}

IP字段中没有IP的记录会打印出一个丑陋的错误。如上所示,我注释掉了错误,但无论如何它都会输出错误。如何正确打印一个充满当前IP地址(或缺少0f)的表,而不必查看所有这些错误:

Warning: inet_ntop() [function.inet-ntop]: Invalid in_addr value in/home/zp/public_html/example.COM/example.php on line 57

3 个答案:

答案 0 :(得分:3)

Warnings不具备catch能力。 try..catch仅阻止例外警告完全是一种不同的错误报告机制。要取消警告,您可以使用error control operator

$ip = @inet_ntop($row['ip']);
echo $ip ? $ip : 'n/a';

当然,您应该首先通过验证传递给inet_ntop的值来完全避免警告。至少:

echo $row['ip'] ? inet_ntop($row['ip']) : 'n/a;

答案 1 :(得分:2)

inet_ntop不会抛出您可以捕获的异常,例如:

try
{
    test_function();
}
catch(Exception $e)
{
    //Relax
}

function test_function()
{
    throw new Exception("Something went wrong");
}

将按预期捕获,您应该做的是通过进行充分的检查来防止错误:

try
{
    $is_valid = filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
    if(!$is_valid)
    {
        throw new Exception('Invalid IP Address');
    }

    echo inet_ntop($row['ip']);
}
catch(Exception $e)
{
     echo 'n/A';
}

答案 2 :(得分:0)

你可以抑制这样的警告,尽管RobertPitt的答案要好得多:

echo(@inet_ntop($row['ip']));