15

背景:假设我有以下明显不正确的 PHP:

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

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

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

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

“at-sign”技巧:

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

类型铸造:

        $vtest = '';
        $vtest = (array)$vtest;  
        print(array_pop($vtest));
4

4 回答 4

14

警告和通知在 PHP 中并不是技术上的例外。要捕获异常,必须显式抛出异常,并且许多内置函数库不会抛出异常(主要是因为它们是在 PHP 支持异常之前编写的)。

如果以某种方式在现有的通知/警告/错误框架之上构建异常,那就太好了,但也许这要求太多了。

于 2009-07-06T14:51:06.657 回答
12

您提供的代码总是会产生警告,但您可以使用set_error_handler来指示如何处理警告;即你可以使它抛出一个异常。此外,您可以在完成后使用restore_error_handler返回默认错误处理。

function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');
于 2009-07-06T14:55:29.490 回答
2

当您将每个错误转换为异常时,您可以捕获此类错误。我已经建立了一个小的错误处理环境。只是测试它 - 它会工作。

于 2009-07-06T14:54:14.703 回答
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));
    }
于 2009-07-06T14:49:27.410 回答