在我們系統中我們經常需要編寫自己的異常類,那我們應該如果編寫呢?今天我們就來看一下,話不多說上個類圖展示一下
java的異常類設計
Throwable是異常類的祖先,提供了異常類的基本的獲取錯誤棧的深度,獲取錯誤棧元素的本地方法,錯誤棧打印,序列化,message獲取,Throwable的實例cause的獲取,其中最重要的錯誤棧打印調用的爲本地方法:
private native Throwable fillInStackTrace(int dummy);
Error與Exception功能實現都是一樣的,只是使用場景稍有不同
Error一般用於永遠都不應該發生的錯誤,如jvm異常崩潰,資源耗盡等,這些應該再設計系統時進行評估給足資源,還有就是jvm的異常崩潰退出在程序運行時永遠不會發生,而且Error在編譯期間編譯器是不會進行檢查的,因爲永遠不應該發生Error,所以程序中也不應該對Error進行捕捉或者繼續拋出。
Exception爲應用程序需要捕捉的錯誤,非RuntimeException子類下的Exception如果希望能夠被拋出的話需要在方法前拋出此異常方法前加上throws ,此類exception稱爲checked exceptions
checked exception是必須要被處理的,即A方法拋出check exception,B方法調用了A方法,那麼B必須要捕捉或者繼續拋出
而繼承了RuntimeException的異常希望拋出的話是不需要throw的,RuntimeException稱爲unchecked exceptions
unchecked exceptions一般是不強制調用者捕捉或者繼續拋出,可以不用處理,因爲此類錯誤一般是由於程序設計的問題產生的
nullpointexception,IndexOutOfBoundsException,java.lang.ArithmeticException: / by zero
總結存在3中異常類
- Error
- Exception(非RuntimeException)
- RuntimeException
Error一般用在永遠不會出現的錯誤
RuntimeException一般用於表示由於程序設計漏洞產生的錯誤
Exception(非RuntimeException)表示流程類的錯誤類
所以在我們的日常使用中可以使用Exception(非RuntimeException)的情況會居多
一般的寫法爲
實現Exception重載的幾種構造函數即可
編寫error與RuntimeException也差不多
異常類的設計
RumtimeException 爲隱性向上拋出的特性
非RumtimeException 則爲顯性的向上拋出
這裏的隱性與顯性是我借用生物遺傳中的隱性與顯性;具體就是隱性不需要調用者進行聲明向上拋出或者捕捉,而顯性則需要顯。
這裏多說一句如果 @Transactional 沒有設置rollbackForspring屬性的事務回滾只支持RumtimeException