您可以透過捕捉 (Throwable) 來捕捉異常和錯誤。
PHP 7 改變了大多數錯誤的回報方式。不同於 PHP 5 使用傳統的錯誤回報機制,現在大多數錯誤是透過拋出 Error 例外來回報。
與一般的例外一樣,這些 Error 例外會向上傳遞,直到遇到第一個相符的 catch
區塊。如果沒有相符的區塊,則會呼叫任何使用 set_exception_handler() 安裝的預設例外處理程式,如果沒有預設例外處理程式,則例外會被轉換為致命錯誤,並像傳統錯誤一樣處理。
由於 Error 的繼承體系並非繼承自 Exception,因此在 PHP 5 中使用 catch (Exception $e) { ... }
區塊來處理未捕捉異常的程式碼,會發現這些 Error 並不會被這些區塊捕捉到。需要使用 catch (Error $e) { ... }
區塊或 set_exception_handler() 處理函式。
Throwable 在 PHP 5.x 上無法運作。
要在 PHP 5.x 和 7 中同時捕捉異常和錯誤,請在先捕捉 Throwable 之後,新增一個用於捕捉 Exception 的區塊。
一旦不再需要支援 PHP 5.x,就可以移除捕捉 Exception 的區塊。
try
{
// 可能拋出 Exception 或 Error 的程式碼。
}
catch (Throwable $t)
{
// 僅在 PHP 7 中執行,在 PHP 5 中不會匹配
}
catch (Exception $e)
{
// 僅在 PHP 5 中執行,在 PHP 7 中不會執行到
}
一篇關於異常、可拋出物件以及 PHP 7 如何處理這些的優秀部落格文章,請見:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
<?php
set_error_handler(function(int $number, string $message) {
echo "處理器捕捉到錯誤 $number: '$message'" . PHP_EOL ;
});
try {
echo $x; # 注意,在可呼叫物件中處理
pg_exec(null, null); # 警告,在可呼叫物件中處理
fho(); # 致命錯誤,停止執行並捕捉
} catch (Throwable $e) {
echo "捕捉到 Throwable: " . $e->getMessage() . PHP_EOL;
}
?>
set_error_handler 也可以在沒有 try 和 catch 的情況下運作
php 7.1
try {
// 可能拋出 Exception 或 ArithmeticError 的程式碼。
} catch (ArithmeticError | Exception $e) {
// pass
}