異常和錯誤處理

試著抓

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 的第二個處理程式。

最後

如果你需要在 trycatch 完成執行後完成某些事情,你可以使用 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 開始,所有異常類都會擴充套件它。