2016-12-17 2 views
2

Пришел сегодня, не уверен, как его решить.Как поймать hex2bin() warning

Я хочу поймать ошибку уровня E_WARNING, выданную hex2bin().

Я думал, что смогу использовать метод исключения try()catch(), но это не сработало.

try { 
    $foo = hex2bin($bar); 
} 
catch (Exception $e) { 
    die('Custom message'); 
} 

Стандарт E_WARNING, который выдается, конечно:

Предупреждение: HEX2BIN(): Входная строка должна быть шестнадцатеричная строка

В этой конкретной ситуации я не хотят использовать стандартные методы для отключения ошибок, таких как:

error_reporting(-1); 
error_reporting(E_ALL); 
ini_set("display_errors", 1); 

Я также не хочу подавлять ошибку, используя метод @hex2bin.

Я на самом деле хочу, чтобы отобразить пользовательскую ошибку, но я просто не могу найти способ поймать, когда hex2bin выдает сообщение об ошибке.

+1

Предупреждения не являются ошибками. И они тоже не исключение. Отказ от самих языковых конструкций, предназначенных для их захвата, кажется глупым. И какую «пользовательскую ошибку» вы хотите отобразить в любом случае (при подаче недействительных/несвязанных данных)? – mario

ответ

5

Вы можете проверить входное значение, чтобы убедиться, что оно является шестнадцатеричным, прежде чем передавать его методу hex2bin.

if (ctype_xdigit($bar) && strlen($bar) % 2 == 0) { 
    $foo = hex2bin($bar); 
} else { 
    //display error here 
} 
+1

Ударьте меня на 1 минуту: D –

+0

Привет, спасибо. Я наткнулся на метод 'ctype_xdigit', прежде чем я только надеялся, что есть другой метод. Предположим, что он работает, так что просто продолжите это. – Abela

+0

Здесь есть недостаток. ['hex2bin' требует, чтобы вход был четной длины) (http://php.net/manual/en/function.hex2bin.php), или он не сработает и зарегистрирует E_WARNING. ['ctype_xdigit'] (http://php.net/manual/en/function.ctype-xdigit.php) проверяет, является ли это шестнадцатеричным числом (т.е.« десятичная цифра или символ из [A-Fa-f] »,) –

1

согласно documentation, hex2bin возвращений:

бинарное представление приведенных данных или FALSE при неудаче.

Это означает, что вы можете сделать что-то вроде этого, если вы хотите использовать его в try/catch блоке:

try { 
    $foo = @hex2bin($bar); 
    if(false === $foo) { 
    throw new Exception("Invalid hexedecimal value."); 
    } 
} catch(Exception $e) { 
    echo $e; 
} 

Да, hex2bin подавляется. Вы можете удалить @, если вы установили error_reporting для подавления предупреждений.

В качестве альтернативы, вы можете проверить тип $foo на ctype_xdigit() перед использованием hex2bin().

Смежные вопросы