這個問題仁者見仁智者見智,每一個人心中的最佳實踐不見得一致,可是你要有想法,這個很關鍵,若是連思考都沒有思考過,那就不太好了。java
不少高級語言都提供了異常處理,好比Java、Python、Ruby,比較底層的語言,好比C,沒有提供異常機制,最近時興的Golang,也沒有提供一般的try-catch異常機制。程序員
異常機制是必須的麼?顯然不是,由於咱們一般能夠用多個返回值來解決,若是語言自己不支持多返回值,那異常機制就是必須的,不然這個語言寫起來真的會很痛苦,你想一想是否是這樣?:)面試
異常,故名思議,就是不正常的程序執行流程,咱們拿Java中的一個類繼承關係舉例: 數據庫
異常狀況大致能夠分紅兩種: 一、沒辦法恢復的,上圖中的Error紅色部分,這種異常狀況出現,程序只能崩潰。好比OutOfMemoryError,顯然是系統內存不夠用了,程序顯然跑不下去了,必須崩潰 二、能夠嘗試恢復的,上圖中的Exception綠色部分,這種狀況一般不會致使程序崩潰,可是我說的是一般,若是處理不當,程序照崩不誤數組
對於第一種狀況,咱們無法處理,屬於不可控因素,一般的作法就是提早監控,好比發現系統內存剩餘量少於10%立馬報警,運維人員確定對此深有感觸:)微信
第二種狀況咱們必定要竭盡所能去處理,由於咱們的服務要追求儘量高的穩定性,五個九、六個9的SLA,因此程序一拋一個exception就立馬crash,實在是不合適運維
下面咱們重點聊聊綠色部分Exception,大部分語言的異常處理機制相似,好比C#、Python、Ruby,出問題了拋異常,上層代碼能夠捕獲,也能夠不捕獲,語言設計者認爲這樣就OK了,Java分得更細,分紅Checked Exception和Unchecked Exception編碼
a)Checked Exception是要在方法定義的時候顯式聲明,上層代碼也要顯式捕獲,這點會在編譯階段強制檢查 b)Unchecked Exception,也叫Runtime Exception,不須要在方法定義的時候顯式聲明,也不強制上層代碼顯式捕獲,一旦拋異常,JVM會沿着方法調用棧層層往上尋找catch塊,若是找遍了都找不到,程序crash設計
那這兩種異常的使用場景是什麼呢?下面是筆者的我的觀點,僅供參考:繼承
一、Runtime Exception只用來處理壞的編碼,這些都是程序員應該提早處理可是忘記處理的,好比NullPointerException,程序員應該在上層代碼中判斷變量是否爲空,若是忘記判斷了,那下層代碼只能用NullPointerException這個RuntimeException來還以顏色。再好比:ArrayIndexOutOfBoundsException、IllegalArgumentException,咋樣,有沒有點感受了?
二、RuntimeException雖然說是程序員犯下的錯誤,可是爲了程序不崩潰,仍是要處理,因此咱們一般會在方法調用棧的最頂層catch全部的異常,而後打印log,發報警郵件給工程師,便於之後作bugfix之類的
三、Checked Exception一般是須要程序員去嘗試恢復的,好比:FileNotFoundException、EOFException。Checked Exception在向上層代碼傳遞一些信息,讓上層代碼對症下藥
四、舉個例子,好比咱們跟數據庫打交道有的時候會遇到connection reset這種異常,這個應該封裝爲哪一種異常返回呢?顯然這不是壞的編碼致使的,因此要用Checked Exception,上層代碼要顯式catch,若是發現是ConnectionResetException,要嘗試重連數據庫。
五、用戶登陸的時候,有人封裝了UserNotFoundException、PasswordErrorException,你以爲是合理的麼?我的認爲能夠這麼用,好比寫了一個Login方法,用戶登陸失敗可能會有多種緣由,要把這多種信息傳達給上層代碼,在一個沒有多返回值的語言中,只能使用多種異常
六、爲了傳達文件不存在這個信息JDK提供了一個FileNotFoundException的異常,你以爲這是合理的麼?筆者的觀點是這樣的:要分狀況看待,若是要寫一個專門判斷文件是否存在的方法FileExists,此時無需定義異常,直接返回一個bool類型的值就行,若是在讀寫文件的方法中,發現某個文件不存在,能夠拋出異常,這其實仍是由於不能有多個返回值致使的,由於文件讀寫操做的方法參數和返回值都是與字節數目啊,字節數組啊之類的,無法往上傳遞文件不存在這個信息,因此,只能用異常了
七、若是能用if-else分支結構來描述的邏輯,不要用異常,雖然說try-catch看起來能夠作分支結構,可是try-catch效率低,不是正常的編碼,百害而無一利
說得比較散亂,看來文筆仍是不行啊,看官多多包含,但願能幫到你:) 本文來自微信公衆帳號:it_mianshiti,一我的天天整理面試題真是比較勢單力薄,求投稿:)