попробуй {inet_ntop ($ row ['ip']) ...} поймать {изящно} в PHP - PullRequest
0 голосов
/ 05 июля 2011

Я работаю над таблицей, которая печатает адреса из базы данных MySQL. Я не уверен, что очень хорошо понимаю блоки try / catch. Старые записи не имеют IP-адреса, но новые записи имеют IP-адрес в таблице. Новые записи (с IP-адресом) распечатываются нормально, но только если я помещаю их в список попыток, как показано ниже:

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 ]

3 голосов
/ 05 июля 2011

Warnings не в состоянии catch. try..catch блоки работают только на Исключения . Предупреждения - это совершенно другой механизм сообщения об ошибках. Для подавления предупреждений вы можете использовать оператор контроля ошибок :

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

Конечно, вам следует полностью избегать предупреждений, проверяя значения, которые вы передаете в inet_ntop. Как минимум:

echo $row['ip'] ? inet_ntop($row['ip']) : 'n/a;
2 голосов
/ 05 июля 2011

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';
}
0 голосов
/ 05 июля 2011

Вы можете подавить предупреждение вот так, хотя ответ Роберта Питта гораздо лучше:

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