簡體   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