異常和錯誤處理
試著抓
try..catch
塊可用於控制可能丟擲異常的程式流。可以優雅地捕獲和處理它們,而不是在遇到 PHP 時讓 PHP 停止:
try {
// Do a bunch of things...
throw new Exception('My test exception!');
} catch (Exception $ex) {
// Your logic failed. What do you want to do about that? Log it:
file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}
以上示例將在 try
塊中丟擲異常,並將其訊息(“我的測試異常!”)記錄到文字檔案中。
捕獲不同的異常型別
你可以為不同型別的異常實現多個 catch
語句,以便以不同方式處理,例如:
try {
throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
var_dump('Standard exception caught: ' . $ex->getMessage());
}
在上面的示例中,將使用第一個 catch
,因為它按執行順序首先匹配。如果你交換了 catch
語句的順序,Exception
捕獲器將首先執行。
同樣地,如果你要扔一個 UnexpectedValueException
, 你會看到正在使用的標準 Exception
的第二個處理程式。
最後
如果你需要在 try
或 catch
完成執行後完成某些事情,你可以使用 finally
宣告:
try {
throw new Exception('Hello world');
} catch (Exception $e) {
echo 'Uh oh! ' . $e->getMessage();
} finally {
echo " - I'm finished now - home time!";
}
上面的例子將輸出以下內容:
哦哦! Hello World - 我現在完成了 - 回家的時間!
丟擲
在 PHP 7 中,我們看到 Throwable
介面的介紹, Error
以及 Exception
實現。這在 PHP 7 中的異常之間新增了服務契約級別,並允許你為自己的自定義異常實現介面:
$handler = function(\Throwable $ex) {
$msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
mail('admin@server.com', $ex->getMessage(), $msg);
echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);
在 PHP 7 之前,你可以簡單地輸入提示 Exception
,因為從 PHP 5 開始,所有異常類都會擴充套件它。