日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

别再瞎搞了,处理Java异常的10个最佳实践

發布時間:2025/3/16 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 别再瞎搞了,处理Java异常的10个最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線上代碼不要使用printStackTrace()

寫完代碼后請一定要檢查下,代碼中千萬不要有printStackTrace()。因為printStackTrace()只會在控制臺上輸出錯誤的堆棧信息,他只適合于用來代碼調試。

真正需要記錄異常,請使用日志記錄。


永遠不要在catch塊中吞掉異常

catch?(NoSuchMethodException?e)?{return?null;}

永遠不要不處理異常,而是返回null,這樣異常就會被吞掉,無法獲取到任何失敗信息,會給日后的問題排查帶來巨大困難。

?

在需要的地方聲明特定的受檢異常

?public?void?foo()?throws?Exception?{?//錯誤做法}

一定要盡量避免上面的代碼,因為他的調用者完全不知道錯誤的原因到底是什么。

在方法聲明中,可以由方法拋出一些特定受檢異常。如果有多個,那就分別拋出多個,這樣這個方法的使用者才會分別針對每個異常做特定的處理,從而避免發生故障。

public?void?foo()?throws?SpecificException1,?SpecificException2?{? //正確做法 } ###?始終只捕獲那些可以處理的異常catch?(NoSuchMethodException?e)? {throw?e;?//這代碼一點用都沒有 }

這是一個基本概念,當你能夠處理他時,你再捕獲這個異常,否則永遠都不要捕獲他。

如果你不能在catch塊中處理它,那么就不要先捕獲再直接拋出,這樣沒有任何意義。

?

盡量捕獲特定的子類,而不是直接捕獲Exception類

try?{someMethod();}?catch?(Exception?e)?{LOGGER.error("method?has?failed",?e);}

以上代碼,最大的問題就是,如果someMethod()的開發者在里面新增了一個特定的異常,并且預期是調用方能夠特殊的對他進行處理。

但是調用者直接catch了Exception類,就會導致永遠無法知道someMethod的具體變化細節。這久可能導致在運行的過程中在某一個時間點程序崩潰。

?

永遠不要捕獲Throwable類

這是一個嚴重的問題,因為Java中的Error也可以是Throwable的子類。但是Error是Java虛擬機本身無法控制的。Java虛擬機甚至可能不會在出現任何錯誤時請求用戶的catch子句。

?

始終在自定義異常中覆蓋原有的異常,這樣堆棧跟蹤就不會丟失

?catch?(NoSuchMethodException?e)?{throw?new?MyServiceException("Some?information:?"?+?e.getMessage());??//錯誤做法}

上面的命令可能會丟失掉主異常的堆棧跟蹤。正確的方法是:

catch?(NoSuchMethodException?e)?{throw?new?MyServiceException("Some?information:?"?,?e);??//正確做法 }

?

可以記錄異常或拋出異常,但不要同時做

catch?(NoSuchMethodException?e)?{LOGGER.error("Some?information",?e);throw?e;}

如上面的代碼所示,拋出和日志記錄可能會在日志文件中產生多個日志消息。

這就會導致同一個問題,卻在日志中有很多不同的錯誤信息,使得開發人員陷入混亂。

?

永遠不要在finally中拋出異常

try?{someMethod();??//拋出?exceptionOne }finally {cleanUp();????//如果在這里再拋出一個異常,那么try中的exceptionOne將會丟失forever }

在上面的例子中,如果someMethod()拋出一個異常,并且在finally塊中,cleanUp()也拋出一個異常,那么初始的exceptionOne(正確的錯誤異常)將永遠丟失。

?

如果您不打算處理異常,請使用finally塊而不是catch塊

try?{someMethod();? }? finally {cleanUp();???? }

這也是一個很好的實踐。如果在你的方法中訪問其他方法,而該方法拋出了異常你不想處理,但是仍然需要做一些清理工作,那么在finally塊中進行清理。不要使用catch塊。

關于作者:Hollis(ID:hollischuang),一個對Coding有著獨特追求的人,現任阿里巴巴技術專家,個人技術博主,技術文章全網閱讀量數千萬,《程序員的三門課》聯合作者。

往期推薦

為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較?

前幾天內推的讀者,已經入職阿里了。

放棄Maven以后,我用了它。。。

本文由“壹伴編輯器”提供技術支

?

直面Java第329期:哪個命令可以監控虛擬機各種運行狀態信息?

深入并發第013期:拓展synchronized——鎖優化

如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發至朋友圈,是對我最大的支持。

點個?在看?

喜歡是一種感覺

在看是一種支持

↘↘↘

總結

以上是生活随笔為你收集整理的别再瞎搞了,处理Java异常的10个最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。