2016-12-17 58 views
2

今天来到这里,不知道如何解决它。如何捕捉hex2bin()警告

我想抓住hex2bin()发出的E_WARNING级别的错误。

我想我可能可以使用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

嘿@mackers谢谢。在我只希望有另一种方法之前,我遇到了'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

documentationhex2bin返回:

给定数据的二进制表示或FALSE的失败。

这意味着如果你想在try/catch块使用它,你可以做这样的事情:

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

是,hex2bin被抑制。如果您设置error_reporting以取消警告,则可以删除@

或者,您可以在使用hex2bin()之前检查$foo的类型与ctype_xdigit()