通常我們在某段成程式加入錯誤的攔截設計(try-catch),是因為覺得這邊可能發生預期的錯誤,
也許是網路或資料庫連結失敗,所以,為了避免發生錯誤時造成使用者體驗不好,通常會紀錄
該錯誤,但會回應使用者較無害的資訊,例如:系統忙碌中,請稍後再試
若是引用第三方套件的API,基本操作上能怎麼處理?
模擬第三方API,設計 ThirdPartyLib 有個 Connection 方法,未實作直接丟出例外錯誤
透過自訂 Service 物件使用該API,並且丟出例外錯誤,使用 throw 關鍵字
Client 端須使用 ToString() 才會有詳細資訊,如下所示
若改成 ex.Message 會只有訊息文字的部分,如下所示
或許有人發現,exception 不是有一個 InnerException 屬性,應該可以拿來使用吧?是的,
但因為有時第三方API沒有包自訂義 Exception ,再加上自己或同仁也沒有包,此時
InnerException 會是 null 值,這樣會出錯,或是要自己繞過,如下圖
而使用 ex.ToString() 方法,內部程式有實作判斷,可以讓我們省去這一段的功,追進去原始碼看一下,
發現 ToString() 方法有被覆寫,並且判斷 innerExceptio 是否為 null,後面也將 StackTrace 內容取出
若時間允許,可能的標準作法如下所示,可以記錄完整的 Log ,可以提供使用者較友善的訊息
建立自訂義的例外類別 MyCustException 繼承至 ApplicationException
調整 MyService 類別,catch 改丟出 MyCustException,並且客製化訊息「系統忙碌中,請稍後再試」
Client 端其實不太需要變動,至於回傳值的接收, Exception 或 MyCustException 兩個型別
都可以正確接到物件,如下所示
【結論】使用 ToString() 輸出訊息紀錄
沒有留言:
張貼留言