java try catch陷阱_Java異常處理最佳實踐及陷阱防范

原標題:Java異常處理最佳實踐及陷阱防范

33c7525e67eba7bff5a95e62f00f6042.png

出自《深夜里的程序猿》

作者:wangzenghuang

前言

不管在我們的工作還是生活中,總會出現各種“錯誤”,各種突發的“異常”。無論我們做了多少準備,多少測試,這些異常總會在某個時間點出現,如果處理不當或是不及時,往往還會導致其他新的問題出現。所以我們要時刻注意這些陷阱以及需要一套“最佳實踐”來建立起一個完善的異常處理機制。

正文

異常分類

760dacce22d213f6fbfd265adddf5e76.png

首先,這里我畫了一個異常分類的結構圖。

在JDK中,Throwable是所有異常的父類,其下分為”Error“和”Exception“。Error意味著出現了不可控的嚴重錯誤,例如OutOfMemoryError。Exception則細分為兩類,受檢異常(check)需要我們手動try/catch或者在方法定義中throws,編譯器在編譯的時候會檢查其合法性。非受檢異常(uncheck)則不需要我們提前處理。這些簡單的概念對于開發人員來說都是必須掌握的,這里就展示個圖例,不做詳細的描述了,我們的”正餐“還在后面。

重新認識try/catch/finally

說到異常處理,這里就不得不提try/catch/finally。try不可以單獨存在,要么搭配catch,要么搭配finally,或者三者并存。

1、try代碼塊:監視代碼塊的執行,發現對應的的異常則跳轉至catch,若無catch則直接到finally塊。

2、catch代碼塊:發生對應的異常會執行里面的代碼,要么處理,要么向上拋出。

3、finally代碼塊:不管是否有異常,都必執行,一般用來清理資源,釋放連接等。然而有以下幾種情況不會執行到這里的代碼。

代碼執行流程未進入try代碼塊。

代碼在try代碼塊中發生死循環、死鎖等狀態。

在try代碼塊中執行了System.exit()操作。

try/catch/finally陷阱

下面介紹兩個我們在使用tcf的時候可能會遇到的陷阱。

代碼1

public class TCFDemo {

public static void main(String[] args) {

//11

System.out.println(returnVal());

}

static int returnVal(){

int a = 1;

int b = 10;

try{

return ++a;

}finally {

return ++b;

}

}

}

陷阱1:在finally中添加return語句,這樣會覆蓋掉try代碼return的值,假如業務邏輯比較復雜,這里是很容易掉坑的,不利于排查錯誤。

代碼2

public class TCFDemo {

public static void main(String[] args) {

Lock lock = new ReentrantLock();

try{

//有可能加鎖失敗

lock.lock();

//dost

}finally {

lock.unlock();

}

}

}

陷阱2:由于lock方法在加鎖的時候有可能會拋出Uncheck異常,如果在try代碼塊中,必然會執行unlock方法,此時由于并沒有加鎖成功,所以會拋出IllegalMonitorStateException,這樣一來后者的異常就覆蓋掉了前者加鎖失敗的異常信息,所以我們應該把加鎖的方法挪至try代碼塊外面。

最佳實踐

好了,前面簡單介紹了異常的分類以及try/catch/finally的注意事項,現在可以總結一下我們在異常處理的時候有哪些”最佳實踐“了。

當需要向上拋出異常的時候,需根據當前業務場景定義具有業務含義的異常,優先使用行業內定義的異常或者團隊內部定義好的。例如在使用dubbo進行遠程服務調用超時的時候會拋出DubboTimeoutException,而不是直接把RuntimeException拋出。

請勿在finally代碼塊中使用return語句,避免返回值的判斷變得復雜。

捕獲異常具體的子類,而不是Exception,更不是throwable。這樣會捕獲所有的錯誤,包括JVM拋出的無法處理的嚴重錯誤。

切記更別忽視任何一個異常(catch住了不做任何處理),即使現在能確保不影響邏輯的正常運行,但是對于將來誰都無法保證代碼會如何改動,別給自己挖坑。

不要使用異常當作控制流程來使用,這是一個很奇葩也很影響性能的做法。

清理資源,釋放連接等操作一定要放在finally代碼塊中,防止內存泄漏,如果finally塊處理的邏輯比較多且模塊化,我們可以封裝成工具方法調用,代碼會比較簡潔。

結尾

小小的異常,有大大的學問,你覺得呢?返回搜狐,查看更多

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vivo手機怎么投屏到電腦_投屏軟件電腦加手機投屏軟件投屏

優秀的資源工具可以讓你事半功倍!本號文內資源已經手工轉存整理,安全起見,回復 “領取資源” 按提示自助領取。今天分享的是一家公司出品的投屏神器。為避免被舉報這里就不說出軟件名了。它可以在局域網內把手機的屏幕投到電腦上,…

How to upload windows Sysprep Files to VMware vCenter Server Appliance 6.5(vC

vCSA5.5中可以登錄到端口5480中去上傳,vCSA 6.0以后就不支持了。但是可以通過Enable “Pi Shell”來做。 首先確保vCSA的ssh可用: 0. Make sure that SSH in enabled on the VCSA. Home > Administration > System configuration (under Deploymen…

開源短地址_如何在短短5分鐘內完成您的第一個開源貢獻

開源短地址by Roshan Jossey羅珊喬西(Roshan Jossey) 如何在短短5分鐘內完成您的第一個開源貢獻 (How to make your first open source contribution in just 5 minutes) The best way to level up your programming skills it to code more. The second best thing is to rea…

【Qt開發】QT對話框去掉幫助和關閉按鈕 攔截QT關閉窗口的CloseEvent

建了一個對話框,我不想把邊框去掉,只想去掉關閉按鈕, setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::WindowContextHelpButtonHint); 結果那個問號的按鈕去掉了,但是關閉按鈕還在,求助啊 set…

Vivado Design Suite用戶指南之約束的使用第二部分(約束方法論)

Constraints Methodology(約束方法論) 關于約束方法論 設計約束定義了編譯流程必須滿足的要求,以使設計在板上起作用。 并非所有步驟都使用所有約束在編譯流程中。 例如,物理約束僅在實現步驟期間使用(即,由…

eval函數 php_PHP的一句話木馬代碼和函數eval的簡介

大清早的剛從床上爬起來。雨落就跑來找我問我這段代碼是什么意思<?php eval($_POST[pp]);?>看了一下&#xff0c;post接收pp的值&#xff0c;抑制錯誤輸出。呵呵開個玩笑&#xff0c;其實不是這么簡單&#xff0c;這是一段PHP木馬代碼&#xff0c;也就是我們所說的后門…

linux安裝python_Python - 愛豆

Python下載Python最新源碼&#xff0c;二進制文檔&#xff0c;新聞資訊等可以在Python的官網查看到&#xff1a;Python官網&#xff1a;你可以在以下鏈接中下載 Python 的文檔&#xff0c;你可以下載 HTML、PDF 和 PostScript 等格式的文檔。Python文檔下載地址&#xff1a;doc…

如何將您的#100DaysOfCode登錄轉換為視覺體驗

by Joe Warren通過喬沃倫 如何將您的&#xff03;100DaysOfCode登錄轉換為視覺體驗 (How to Transform Your #100DaysOfCode Log Into a Visual Experience) Learning how to code is an unrivaled modern experience. As an aspiring developer, no matter what level you’r…

Python中集合(set)的操作及一些比較常見的用法

Python除了List、Tuple、Dict等常用數據類型外&#xff0c;還有一種數據類型叫做集合&#xff08;set&#xff09;&#xff0c;集合的最大特點是&#xff1a;集合里邊的元素是不可重復的并且集合內的元素還是無序的&#xff0c;所以一般情況下集合常用的兩個場景是&#xff1a;…

php中的圖像下載函數,PHP實現的下載遠程圖片自定義函數分享

/*** PHP下載遠程圖片到本地** param $url string 遠程文件地址* param $filename string 保存后的文件名(為空時則為隨機生成的文件名&#xff0c;否則為原文件名)* param $fileType array 允許的文件類型* param $dirName string 文件保存的路徑(路徑其余部分根據時間系統自動…

Linux 文件的壓縮與解壓

1. tar結尾壓縮命令 [roottest ~]# tar -cvf grub.tar /boot/grub/ 查看壓縮包文件 [roottest ~]# tar -vtf grub.tar 解壓文件 #tar -xvf grub.tar # tar -xvf grub.tar -C 解壓目錄 2. gz結尾壓縮命令 # tar -zcvf grub.tar.gz /boot/grub gz結尾解壓命令 #tar -zxvf gr…

深度學習筆記-卷積神經網絡CNN與循環神經網絡RNN有什么區別?

轉載 https://blog.csdn.net/weixin_35227692/article/details/79223536轉載于:https://www.cnblogs.com/USTBlxq/p/10445268.html

參考框架 系統 基準_帶有基準的前端框架的實際比較

參考框架 系統 基準by Jacek Schae由Jacek Schae 帶有基準的前端框架的實際比較 (A Real-World Comparison of Front-End Frameworks with Benchmarks) UPDATE: There is a newer version of this article更新&#xff1a;本文有較新的版本 A Real-World Comparison of Front…

ppt復制切片器_零基礎小白自學PPT快速入門到精通(上)

零基礎小白如何自學PPT快速入門到精通呢&#xff1f;40個保姆級小技巧助力你高效掌握PPT基礎操作&#xff01;PPT在學習與工作中的應用越來越廣泛&#xff1a;在學校時免不了要做畢業答辯、畢業論文&#xff0c;工作中時常要進行復盤總結、工作匯報、推廣方案&#xff0c;有時甚…

網絡安全初創公司SafeBreach獲1500萬美元A輪融資

今天&#xff0c;網絡安全初創公司 SafeBreach 宣布完成1500 萬美元 A 輪融資&#xff0c;新投資者德國電信、惠普公司、 Maverick Ventures 及現有投資者 Sequoia Capital 和 Shlomo Kramer 參投。公司計劃利用本輪融資加大研發力度&#xff0c;擴大銷售及營銷團隊&#xff0c…

php網站分區,PHP - Manual: 分區和分片 (官方文檔)

分區和分片數據庫群組是由于各種各樣的原因建立的&#xff0c;他可以提升處理能力、容忍錯誤&#xff0c;并且提升大量服務器同時工作的的性能。群組有時會組合分區和共享功能&#xff0c;來將大量復雜的任務分拆成更加簡單的任務&#xff0c;更加可控的單元。插件可以支持各種…

webBroser獲取cookie

//取當前webBrowser登錄后的Cookie值 [DllImport("wininet.dll", CharSet CharSet.Auto, SetLastError true)]static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags…

了解Linux操作系統發展階段

一、硬件與軟件發展歷史 計算機由硬件和軟件組成結構 二、Linux的發展史 Linux 操作系統是Unix操作系統的一種克隆系統。它誕生于1991年的10月5日&#xff08;只是第一次正式向外公布的時間&#xff09;。以后借助于Internet網絡&#xff0c;并經過全世界各地計算機愛好者的共同…

c gui qt 4編程第二版_面試官問Linux下如何編譯C程序,如何回答?為你編譯演示

文章來源&#xff1a;嵌入式大雜燴 作者&#xff1a;ZhengNLWindows下常用IDE來編譯&#xff0c;Linux下直接使用gcc來編譯&#xff0c;編譯過程是Linux嵌入式編程的基礎&#xff0c;也是嵌入式高頻基礎面試問題。一、命令行編譯及各個細分編譯過程hello.c示例代碼&#xff1a;…

Python基礎-----列表、元組、集合(2)

raw_input ##字符類型input##數值類型##格式化輸出注釋切片s[2:5]##切片從2開始到5&#xff0c;不包括5[kioskfoundation39 mnt]$ pythonPython 2.7.5 (default, Oct 11 2015, 17:47:16) [GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2Type "help", "copyri…