我目睹了一些關於最近項目中PHP異常處理的奇怪行爲。案例如下。PHP:命名空間類,類加載和異常導致奇怪的行爲
在我的應用程序中,我使用命名空間。所有類都在單獨的源代碼文件中。與這個特殊情況相關的代碼分佈在3個類中。
「最外層」類是調度程序(或路由器),它將調度調用包裝在try-catch塊內。調度的請求調用第三個類中的方法,該方法運行代碼(包裝在try-catch塊中),這會導致異常。
因爲我在發生錯誤的類中省略了use Exception;
語句,拋出的異常一路回到最外層(調度程序),它被抓到 - 導致我抓我的頭爲什麼catch圍繞導致錯誤的代碼不起作用。
對我來說這似乎很奇怪。從邏輯上講,PHP應該在這種情況下(IMO)拋出一個Class not found
異常/錯誤,導致我在代碼中發生實際錯誤,而不是儘可能長時間地「活着」。
這應該作爲錯誤提交還是這種預期行爲?
編輯:代碼示例
文件:
<?php
namespace hello\world;
class classA {
protected $b;
public function __construct() {
$this->b = new \hello\world\classB();
}
public function doSomething() {
try {
$this->b->throwException();
} catch (Exception $e) {
}
}
}
文件:class-b.php
<?php
namespace hello\world;
class classB
{
public function throwException() {
throw new \Exception("bar closed");
}
}
文件:run.php
<?php
include 'class-a.php';
include 'class-b.php';
$a = new \hello\world\classA();
$a->doSomething();
ClassB的throw
S IN ClassB::doSomething()
一個\Exception
,爲此ClassA
具有catch
-clause,但由於ClassA
沒有聲明use Exception
或catch (\Exception)
,所述catch
不匹配和執行與Uncaught exception
誤差結束。但在我看來,這應該會導致Class not found
錯誤。
我可能會期望過多的寬容的PHP編譯器,但它有助於追蹤應該很容易被編譯器發現的愚蠢錯誤。
如果run.php
的$a->doSomething()
用try..catch
子句環繞,Exception
將(或至少可以)在那裏被捕獲,因爲它滑下的堆棧。
請附上一個小代碼示例 – erenon
同樣在評論中描述:http://www.php.net/manual/en/ language.exceptions.php#99702 –