代碼潔癖系列(六):處理錯誤

  • 2020 年 3 月 11 日
  • 筆記

程序運行過程中,有些錯誤是不可避免的,而如何使程序在出現錯誤時代碼仍然正常工作就成了程序員的日常工作之一。那麼處理錯誤和代碼整潔有什麼關係呢?

前面我們提到過,try-catch代碼塊會破壞代碼的結構。但是,我們在處理錯誤時又不得不使用try-catch代碼塊,這樣才能讓我們的程序保持健壯。那麼如何兼顧整潔和健壯呢,這就是我們今天要討論的內容。

不要使用返回碼

在上古時期,很多語言還都不支持異常,程序員們只能約定好返回的錯誤碼,通過不同的錯誤碼對代碼進行錯誤處理。這麼做需要調用者在調用方法後馬上判斷返回值來決定是否需要處理錯誤。而這一步驟往往被遺忘,就會導致程序出現不可預估的問題。所以,現在我們有了throw和try-catch這樣的「熱武器」,就不要再用錯誤碼這樣的「冷兵器」了。不然很容易就會被別人給秒殺的。

try-catch-finally相信大家都很熟悉,不熟悉的話,可以前往與本公號達成合作的各大搜索引擎進行搜索,保證有答案。

異常拋出的層級

我們不希望程序中充滿了try-catch代碼塊,這樣會使程序的可讀性變差。因此,我們要適當的使用throw語句,將異常拋出。交給上一層去處理。但是,如果只由最頂層的代碼去處理異常,整個程序看上去是會整潔一些,但當我們需要修改某個底層代碼拋出的異常時會發生什麼呢?我們需要找到往上拋的每一個方法去修改它的簽名,拋出新的異常,並重新發佈。這會使我們的工作量增加好幾倍。所以,我們的異常最好在本層進行統一處理,或者在拋出後的上一層就進行處理。

說明發生異常的環境

在Java中,系統異常通常會給出調用棧,便於我們進行問題的定位和調試。對於我們自己拋出的異常,也應該給出異常發生的環境,例如列出調用棧,給出請求參數等等。

遠離null值

我們在讀、寫代碼時,一定有被好多層的空指針判斷折磨的經歷。一不小心漏掉一個判斷,那麼程序就會出現空指針異常,這個異常要麼被上層的catch捕獲,要麼直接拋出。很明顯,這兩種結果都不是我們想要的。怎麼遠離空指針異常呢?

首先,代碼的返回值不要返回null。可以選擇直接拋出一個異常,或者返回一個特定的值,比如空對象等。

其次,代碼調用時,參數不要傳null,因為一旦傳null,那麼在方法體中就需要對這個參數進行非空判斷。而目前還沒有什麼好的方法可以簡單高效的處理參數外部傳來的null,只能使用if判斷。因此希望大家在調用別的方法時盡量不要傳入null。

小結

本文的主要目的是使我們的代碼兼顧整潔性和健壯性。這就需要我們將錯誤處理獨立於主邏輯之外,使錯誤就可以被單獨處理,不但能夠增強可讀性,還能增強可維護性。最後得到的就是我們希望看到的整潔而健壯的代碼。如果覺得文章不錯的話,歡迎幫忙點贊或轉發。

—END—