有時候,錯誤是不可避免的。某些完全不可預測的情況會發生。但是很多時候,我們可以提前考慮,編寫能夠攔截錯誤並在出現錯誤時執行合理操作的代碼。例如向用戶顯示有用的錯誤消息,或嘗試使用解決方法。

我們使用**例外(exceptions)**來實現這一點。

例外是用於使我們開發者意識到問題的存在。

我們將可能引發例外的代碼包裝在try塊中,並在其後緊跟一個catch塊。如果在try塊中發生例外,則將執行該catch塊:

try {
 // 執行某些代碼
} catch (Throwable $e) {
 // 在這裡可以處理例外情況
}

注意,我們在catch塊中使用了一個Exception對象$e,我們可以檢查該對象以獲取有關例外的更多信息,例如:

try {
 // 執行某些代碼
} catch (Throwable $e) {
 echo $e->getMessage();
}

讓我們舉個例子。

例如,如果我錯誤地將一個數字除以零:

echo 1 / 0;

這將觸發一個致命錯誤,並且程序在該行上停止運行。

Error Screenshot

將這個操作包裝在try塊中,並在catch塊中打印錯誤消息,程序將順利結束並告訴我問題所在:

try {
 echo 1 / 0;
} catch (Throwable $e) {
 echo $e->getMessage();
}

Error Screenshot

當然,這只是一個簡單的例子,你可以看到好處:我可以攔截問題。

每個例外都有不同的類。例如,我們可以捕獲DivisionByZeroError類型的例外,這樣我就可以對可能的問題進行過濾並進行不同的處理。

我還可以在最後添加一個catch-all塊,捕獲所有的可投擲錯誤,例如:

try {
 echo 1 / 0;
} catch (DivisionByZeroError $e) {
 echo 'Ooops I divided by zero!';
} catch (Throwable $e) {
 echo $e->getMessage();
}

我還可以在這個try/catch結構的末尾添加一個finally {}塊,以在代碼成功執行或出現捕獲時執行一些代碼:

try {
 echo 1 / 0;
} catch (DivisionByZeroError $e) {
 echo 'Ooops I divided by zero!';
} catch (Throwable $e) {
 echo $e->getMessage();
} finally {
 echo ' ...done!';
}

你可以使用PHP提供的內置例外,但你也可以自己創建例外類。