我正在使用从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
答案 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']));