繁体   English   中英

PHP try-catch块:它们能够捕获无效的arg类型吗?

[英]PHP try-catch blocks: are they able to catch invalid arg types?

背景:假设我有以下显然不正确的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));

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

如果在现有的通知/警告/错误框架之上建立某种异常,那可能会很好,但可能会提出太多要求。

您提供的代码将始终生成警告,但您可以使用set_error_handler来指示警告的处理方式; 即你可以使它抛出异常。 此外,您可以使用restore_error_handler在完成后返回默认错误处理。

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

将每个错误转换为异常时,可以捕获此类错误。 我已经建立了一个小错误处理环境 试试吧 - 它会起作用。

我能想到的唯一方法是做以下事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM