后台:假设我有以下明显错误的PHP:
try{
$vtest = '';
print(array_pop($vtest));
}catch(Exception $exx){}
为了使用array_pop,$ vtest显然应该是一个数组,而不是一个字符串。然而,当我运行此代码时,会显示警告。我不希望这样,我只是希望代码无声地失败。
问题:与其他语言相比,PHP try-catch是否有一些特殊之处导致这种情况无效?
声明: 仅供参考,确实有其他方法可以在PHP中处理这种情况,但这些都是不可取的。这里的目标是避免:
“签名”技巧:
$vtest = '';
print(@array_pop($vtest)); // <-- would like to avoid this
类型转换:
$vtest = '';
$vtest = (array)$vtest;
print(array_pop($vtest));
答案 0 :(得分:13)
警告和通知在PHP中不是技术上的例外。要捕获异常,必须明确抛出它,并且许多内置的函数库不会抛出异常(主要是因为它们是在PHP支持的异常之前编写的)。
如果在现有的通知/警告/错误框架之上建立了某些异常,那可能会很好,但可能会提出太多要求。
答案 1 :(得分:11)
您提供的代码始终会生成警告,但您可以使用set_error_handler来指示警告的处理方式;即你可以使它抛出异常。此外,您可以使用restore_error_handler在完成后返回默认错误处理。
function errorHandler($errno, $errstr, $errfile, $errline) {
throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');
答案 2 :(得分:2)
将每个错误转换为异常时,可以捕获此类错误。我已经设置了一点error-handling environment。试试吧 - 它会起作用。
答案 3 :(得分:0)
我能想到的唯一方法就是做到以下几点:
try{
$vtest = '';
if(is_array($vtest)){
print(array_pop($vtest));
}
else{
throw new NotArrayException()
}
}catch(NotArrayException $exx){}
当然,如果您只是想以静默方式执行此操作,则可以执行以下操作,因为您不需要捕获任何异常:
$vtest = '';
if(is_array($vtest)){
print(array_pop($vtest));
}