2009-07-06 26 views
12

背景:假设我有以下明显的,不正确的PHP:PHP try-catch块:它们能够捕获无效的arg类型吗?

try{ 
     $vtest = ''; 
     print(array_pop($vtest)); 
    }catch(Exception $exx){} 

对于它与array_pop工作,$ VTEST显然应该是一个数组,而不是字符串。不过,当我运行此代码时,会显示警告。我不想那样,我只想让代码默默地失败。

问题:与其他语言相比,PHP try-catch有什么特殊之处导致它不起作用?

声明: 仅供参考,在PHP中确实有其他方法可以处理这种情况,但这些都是不可取的。这样做的目的是为了避免:

的 “at符号” 绝招:

 $vtest = ''; 
     print(@array_pop($vtest)); // <-- would like to avoid this 

类型转换:

 $vtest = ''; 
     $vtest = (array)$vtest; 
     print(array_pop($vtest)); 
+0

还看到:http://verysimple.com/2010/11/02/catching-php-errors-warnings-and-notices/ – dreftymac 2011-11-21 13:52:06

+0

另见:http://eev.ee/blog/2012/04/09/PHP-A-分形的坏设计/#错误处理 – dreftymac 2015-04-02 23:12:41

回答

10

警告和通知在技术上并非在PHP中的例外。捕捉异常它必须明确地抛出,以及众多的内置函数库不抛出异常(主要是因为他们写之前PHP支持例外)。

这本来是很好,如果莫名其妙的异常是建立在现有的通知/警告/错误框架之上,但也许是太奢侈了。

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)); 
    } 
2

你能赶上这样的错误,当你每次错误转化为异常。我已经成立了一个小小的error-handling environment。只要测试它 - 它会起作用。

10

警告将永远支持你提供的,但你可以使用set_error_handler支配警告是如何处理的代码制作;即你可以导致它抛出一个异常。此外,您可以在完成后使用restore_error_handler返回默认错误处理。

function errorHandler($errno, $errstr, $errfile, $errline) { 
    throw new Exception($errstr, $errno); 
} 
set_error_handler('errorHandler');