[英]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.