一起搞懂PHP的錯誤和異常(三)

2022-06-29 07:19:41 字數 1613 閱讀 1326

關於錯誤與異常的最後一篇文章,我們來進行一些總結。

php7中重新定義了一些錯誤的處理方式,讓大部分錯誤可以進行捕獲。而且增加了乙個 throwable 介面,它可以捕獲大部分的錯誤和所有的異常。

也就是說,很多錯誤可以通過try...catch進行捕獲了。而無法捕獲的基本上是警告類的錯誤,這些錯誤可以通過 set_exception_handler() 進行註冊處理。

error 類不是繼承自 exception 類,所以想全域性捕獲的話最好還是使用 throwable 來進行捕獲,不管是 error 還是 exception 都實現了這個介面。

try  catch (throwable $e) 

echo '未定義test()', php_eol;

try catch (argumentcounterror $e)

echo '沒給pdo引數', php_eol;

function test1() : int

try catch (typeerror $e)

echo '返回值型別不正確', php_eol;

上面的例子中我們捕獲了在php5中被定義為錯誤的異常。如果不使用try...catch進行捕獲的話,它們在php7中依然會被當做錯誤來對待。我們來看看 throwable 下面都有哪些新增加的錯誤異常處理類。

throwable

assertionerror

compileerror

typeerror

exception

另外我們還可以通過全域性註冊來對異常進行全域性處理,也就是上面所說的 set_exception_handler() 方法。注意,使用這個全域性註冊異常處理後,出現異常後面的**將不執行了。相當於進行了截斷,這樣的話只能記錄乙個異常日誌。

set_exception_handler(function ($ex) );

test();

echo 'not execute...'; // 不會輸出了

像是除0這種錯誤,經過測試發現 divisionbyzeroerror 類還是無法捕獲,這樣的錯誤如果想捕獲,我們可以使用 set_error_handler() 獲取異常後再丟擲錯誤。

set_error_handler(function ($errno, $errmsg) else

});trycatch(divisionbyzeroerror $e)catch(error $e)

通過 set_error_handler() 丟擲異常,我們就可以捕獲這些警告型別的錯誤了,不管是 warning 還是 notice 。可以切換注釋來檢視除0錯誤和未定義變數錯誤分別丟擲的異常。不過就像我們一直強調的那樣,這類錯誤是可以直接避免的,除前先對除數判斷一下就可以直接丟擲異常或者返回錯誤資訊了,不要讓php來報錯。

通過這三篇文章,可以說我們基本上能夠清楚地了解php中錯誤和異常的區別、特點以及他們的使用場景,並且能夠針對不同的錯誤和異常進行相應的處理了。當然,相關的內容其實還有很多,將來在發現類似的內容時我們還會通過單獨的文章來進行獨立的講解。這次我們就先完結了總體的錯誤和異常的學習哈。接下來的學習將繼續圍繞php官方文件進行,後續依然精彩!!

測試**:

參考文件:

一起搞懂PHP的錯誤和異常(二)

上回文章中我們講到了錯誤是編譯和語法執行時會出現的,它們與邏輯無關,是程式設計師在碼 時不應該出現的,也就是說,這些錯誤應該是盡量避免帶到線上環境的,他們不能通過try.catch捕獲到。而異常則正好相反。異常,指的是程式執行 現的不符合預期的情況,通常允許它發生,並交由相應的異常處理來進行處理。當...

PHP設定錯誤和異常處理三函式

register shutdown function array debug fatalerror 定義php程式執行完成後執行的函式 設定乙個使用者定義的錯誤處理函式 下面講一下register shutdown function 函式.功能 register shutdown function ...

PHP設定錯誤和異常處理三函式

register shutdown function array debug fatalerror 定義php程式執行完成後執行的函式 設定乙個使用者定義的錯誤處理函式 下面講一下register shutdown function 函式.功能 register shutdown function ...