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

2021-10-07 23:06:26 字數 1900 閱讀 5334

上回文章中我們講到了錯誤是編譯和語法執行時會出現的,它們與邏輯無關,是程式設計師在碼**時不應該出現的,也就是說,這些錯誤應該是盡量避免帶到線上環境的,他們不能通過try...catch捕獲到。而異常則正好相反。

異常,指的是程式執行**現的不符合預期的情況,通常允許它發生,並交由相應的異常處理來進行處理。當然,你也可以選擇忽略掉異常的處理,但是就像嚴重錯誤一樣,**馬上會終止執行。異常屬於業務邏輯上的錯誤,基本上是我們人為的。

還是先通過乙個簡單的**看下異常的丟擲和捕獲:

function test()

try  catch (exception $e)

我們通過 throw 來丟擲異常,然後在呼叫方法時將方法包裹在 try...catch 塊中來捕獲丟擲的異常。這就是異常最基礎的結構。

從這裡我們可以看出,異常基本都是通過我們手動進行丟擲的,讓外部來進行處理。在php內部多數也是在類中會進行異常的丟擲,這就是物件導向的錯誤處理思想了。比如說pdo類:

try  catch (pdoexception $e)
注意上面那行注釋的**,沒有傳引數是錯誤,是無法捕獲的。而傳了的引數不對,就是異常了,在pdo類的原始碼中發現引數不對進行了丟擲。交給上層**也就是我們這些呼叫方來進行捕獲。

接下來,我們看下自定義的異常類和finally語句塊的使用。

自定義的異常類都會去繼承 exception 類,這個類可以看做是所有異常的基類。它的結構如下:

class exception

通過上述類定義,我們可以看出,我們能重寫 建構函式 和 __tostring() 方法,也能使用一些受保護的屬性。那麼我們就來定義乙個自定義的異常類吧。

class testexception extends exception

public function __tostring()

}function test2()

try  catch (testexception $e)

還是非常好理解的吧,大部分的php框架都會有自定義異常的元件或者能力供我們使用,因為現代框架還是以物件導向為基礎的,所以異常會定義的比較詳細。不同元件會提供不同的異常類來進行異常的提示封裝。

接下來就是 finally 關鍵字,其實這個並沒有什麼可多說的,finally 的特點就是不管有沒有出現異常,都會去執行 finally 關鍵字所定義**塊內部的內容。

try  catch (testexception $e)  finally 

// code: 200; testexception:this is test2 error...

// continue this code ...

說了這麼多,最後我們來結合上述內容來處理下除0錯誤的異常丟擲。在文章開頭已經說過,錯誤是應該避免的,而異常是屬於邏輯業務的。所以當我們接到乙個需要做除法的引數時,可以先判斷這個數是否為0,如果是0的話,就丟擲異常讓上層呼叫者來處理,如果不是0的話,就讓它正常進行除法運算就好了。

function test3($d)

return 1 / $d;

}try  catch (exception $e)  finally 

// 0.5

// finally:繼續執行!

try  catch (exception $e)  finally 

// excepition:除數不能為0

// finally:繼續執行!

異常相關的使用就是這些了,通過這兩篇文章,相信大家已經對php的錯誤和異常有了一些直觀的了解了。接下來的文章我們將一起對比下錯誤和異常,並且說明一下php7對錯誤有了哪些改進。內容依然精彩,值得期待哦!!

測試**:

參考文件:

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

關於錯誤與異常的最後一篇文章,我們來進行一些總結。php7中重新定義了一些錯誤的處理方式,讓大部分錯誤可以進行捕獲。而且增加了乙個 throwable 介面,它可以捕獲大部分的錯誤和所有的異常。也就是說,很多錯誤可以通過try.catch進行捕獲了。而無法捕獲的基本上是警告類的錯誤,這些錯誤可以通過...

和Zend Framework 一起成長(二)

上接 和zend framework 一起成長 一 我們打算建立乙個非常簡單的庫存系統 它用來管理我們的cd 收藏。在主頁上將列出我們的收藏並允許我們新增,編輯和刪除這些收藏的cd。我們打算把這些儲存到乙個資料庫裡。資料庫的設計是這樣的 所需要的頁面 下面這些頁面是必需的。組織頁面 在設定檔案之前,...

報告ArrayList的乙個錯誤,大家一起來研究下

目的 計算一段文字中重複出現的詞的個數。分兩種情況 1.文字在記憶體中 2.文字在硬碟檔案上 方案利用arraylist 宣告乙個類 public class entity color red 1.文字在記憶體中 color 主類中有以下 string words arraylistenlist n...