我只是想仔細檢查一下我剛剛發現的是否是默認的 PHP 行為,因為我無法解釋它。假設您構建了一個自定義 PHP Exceptions 類:
<?php
namespace XYZ;
if ( ! class_exists( 'XYZ\CustomException' ) ) {
class CustomException extends \Exception {
public function __construct( int $code ) {
parent::__construct( "The error code is: $code", $code );
}
}
}
?>
然后啟動一個 PHP 腳本,其內容如下:
try {
throw new CustomException(1);
} catch ( \Exception $e ) {
echo "regular exception thrown";
} catch ( CustomException $e ) {
echo "custom exception thrown";
}
運行該塊時,我得到"regular exception thrown".
當我將腳本的 catch 塊反轉為:
try {
throw new CustomException(1);
} catch ( CustomException $e ) {
echo "custom exception thrown";
} catch ( \Exception $e ) {
echo "regular exception thrown";
}
我明白了"custom exception thrown"。
如果先撰寫父類catch塊,那么在PHP中實際上是否默認該類的子Exception類將被父處理程式捕獲?或者這是某種不尋常的奇怪配置?ExceptionException
uj5u.com熱心網友回復:
當拋出例外時,它會try按順序遍歷塊,測驗例外是否是指定類的實體,并在到達第一個匹配塊時停止。由于CustomException是 的子類Exception,因此該catch ( \Exception )塊與該測驗匹配,因此它首先停在那里。
它本質上是這樣的:
if (is_a($e, 'Exception')) {
echo "regular exception thrown";
} elseif (is_a($e, 'CustomException')) {
echo "custom exception thrown";
}
它不會嘗試找到catch最接近匹配的塊,它只是按順序完成。您有責任根據具體情況對其進行排序。
檔案解釋了這一點:
catch遇到與拋出物件型別匹配的拋出例外或錯誤的第一個塊將處理該物件。
uj5u.com熱心網友回復:
那是正常的行為。由于您CustomException正在繼承Exception并且您的第一個catch反對Exception它將首先在這里停止。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/468405.html
上一篇:如何將Eloquentwhere()應用于hasMany()關系中的子級
下一篇:將json資料拉入php
