2024 年日本 PHP 研討會

PHP 7 的錯誤

PHP 7 改變了大多數錯誤的回報方式。不同於 PHP 5 使用傳統的錯誤回報機制,現在大多數錯誤是透過拋出 Error 例外來回報。

與一般的例外一樣,這些 Error 例外會向上傳遞,直到遇到第一個相符的 catch 區塊。如果沒有相符的區塊,則會呼叫任何使用 set_exception_handler() 安裝的預設例外處理程式,如果沒有預設例外處理程式,則例外會被轉換為致命錯誤,並像傳統錯誤一樣處理。

由於 Error 的繼承體系並非繼承自 Exception,因此在 PHP 5 中使用 catch (Exception $e) { ... } 區塊來處理未捕捉異常的程式碼,會發現這些 Error 並不會被這些區塊捕捉到。需要使用 catch (Error $e) { ... } 區塊或 set_exception_handler() 處理函式。

新增註釋

使用者貢獻的註釋 5 則註釋

hungry dot rahly at gmail dot com
8 年前
您可以透過捕捉 (Throwable) 來捕捉異常和錯誤。
demis dot palma at tiscali dot it
8 年前
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 中不會執行到
}
ryan dot jentzsch@{gmail} dot com
7 年前
一篇關於異常、可拋出物件以及 PHP 7 如何處理這些的優秀部落格文章,請見:https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
diogoca at gmail dot com
5 年前
<?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 的情況下運作
lubaev dot ka at gmail dot com
8 年前
php 7.1

try {
// 可能拋出 Exception 或 ArithmeticError 的程式碼。
} catch (ArithmeticError | Exception $e) {
// pass
}
To Top