兩年前受TP中Model設計的影響,處理錯誤的時候總是給class定義一個
error
私有屬性,然后定義__get
魔術方法,其它方法遇到錯誤時返回false
并將錯誤原因寫入error
屬性.
其實那時候并非不知道有Exception
這個好東西,只是嫌棄每次throw new \Exception()
太長串的.不過隨著項目的復雜性提高,感覺Exception
真是個好東西,尤其是PHP7
開始已經能捕獲致命錯誤了,這對于解釋型的語言來說簡直就是福音.
基本的概念就不說了,網上一大堆,下面的代碼僅限PHP7
環境.
1. 如何捕獲致命錯誤
PHP7開始可捕獲致命錯誤(例如: function未定義).
大多數情況下我們是這樣用的:
// function abc() 并未定義
try {
abc();
}
catch (\Throwable $e) {
echo "Error code: " . $e->getCode() . PHP_EOL;
echo "Error message: " . $e->getMessage() . PHP_EOL;
echo "Error file: " . $e->getFile() . PHP_EOL;
echo "Error fileline: " . $e->getLine() . PHP_EOL;
}
運行該文件php -f text1.php
# output
Error code: 0
Error message: Call to undefined function abc()
Error file: C:\Users\Administrator\Desktop\test.php
Error fileline: 4
可以看到即便是這樣的致命錯誤也可以被捕獲了,Throwable
是Exception
和Error
的父類,因為致命錯誤屬于Error
,所以這里要想同時捕獲Exception
和致命錯誤
就必須catch Throwable
.
2.省略try{}catch{}
// 注冊錯誤處理函數
set_exception_handler(function(\Throwable $e){
// 如果是ajax請求
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
echo json_encode([
'success' => false,
'message' => $e->getMessage()
]);
}else{
echo "Error code: " . $e->getCode() . PHP_EOL;
echo "Error message: " . $e->getMessage() . PHP_EOL;
}
});
// 這樣就不必每次到try來捕獲異常了
throw new \Exception("模擬的異常", 501);
運行該文件php -f text2.php
# output
Error code: 501
Error message: 模擬的錯誤