《Java編程的邏輯》筆記25--異常(下)/異常處理

異常(下).png

異常處理

  • catch匹配
try{
    //可能觸發(fā)異常的代碼
}catch(NumberFormatException e){
    System.out.println("not valid number");
}catch(RuntimeException e){
    System.out.println("runtime exception "+e.getMessage());
}catch(Exception e){
    e.printStackTrace();
}

catch可以有多條
異常處理機(jī)制將根據(jù)拋出的異常類型找第一個(gè)匹配的catch塊,找到后, 執(zhí)行catch塊內(nèi)的代碼,其他catch塊就不執(zhí)行了,如果沒(méi)有找到歧斟,會(huì)繼續(xù)到上層方法中查找。需要注意的是偏形,拋出的異常類型是catch中聲明異常的子類也算匹配静袖,所以需要將最具體的子類放在前面,如果基類Exception放在前面俊扭,則其他更具體的catch代碼將得不到執(zhí)行

  • 重新throw
try{
    //可能觸發(fā)異常的代碼
}catch(NumberFormatException e){
    System.out.println("not valid number");
    throw new AppException("輸入格式不正確", e);
}catch(Exception e){
    e.printStackTrace();
    throw e;
}

為什么要重新拋出呢队橙?
因?yàn)楫?dāng)前代碼不能夠完全處理該異常,需要調(diào)用者進(jìn)一步處理
為什么要拋出一個(gè)新的異常呢萨惑?
當(dāng)然是當(dāng)前異常不太合適捐康,不合適可能是信息不夠,需要補(bǔ)充一些新信息庸蔼,還可能是過(guò)于細(xì)節(jié)解总, 不便于調(diào)用者理解和使用,如果調(diào)用者對(duì)細(xì)節(jié)感興趣姐仅,還可以繼續(xù)通過(guò)getCause()獲取到原始異常花枫。

  • finally
try{
    //可能拋出異常
}catch(Exception e){
    //捕獲異常
}finally{
    //不管有無(wú)異常都執(zhí)行
}

catch不是必需的
不管有無(wú)異常發(fā)生刻盐,都會(huì)執(zhí)行
(1)如果沒(méi)有異常發(fā)生,在try內(nèi)的代碼執(zhí)行結(jié)束后執(zhí)行劳翰。
(2)如果有異常發(fā)生且被catch捕獲敦锌,在catch內(nèi)的代碼執(zhí)行結(jié)束后執(zhí)行
(3)如果有異常發(fā)生但沒(méi)被捕獲,則在異常被拋給上層之前執(zhí)行佳簸。
一般用于釋放資源乙墙,如數(shù)據(jù)庫(kù)連接、文件流等

  • return
    如果在try或者catch語(yǔ)句內(nèi)有return語(yǔ)句溺蕉,則return語(yǔ)句在finally語(yǔ)句執(zhí)行結(jié)束后才執(zhí)行,但finally并不能改變返回值
    如果在finally中也有return語(yǔ)句呢悼做?try和catch內(nèi)的return會(huì)丟失疯特,實(shí)際會(huì)返回finally中的返回值。 finally中有return不僅會(huì)覆蓋try和catch內(nèi)的返回值肛走,還會(huì)掩蓋try和catch內(nèi)的異常漓雅,就像異常沒(méi)有發(fā)生一樣
  • throws
    用于聲明一個(gè)方法可能拋出的異常
    語(yǔ)法
public void test() throws AppException, SQLException, NumberFormatException {
    //....
}

對(duì)于RuntimeException(unchecked exception),是不要求使用throws進(jìn)行聲明的朽色,但對(duì)于checked exception邻吞,則必須進(jìn)行聲明,換句話說(shuō)葫男,如果沒(méi)有聲明抱冷,則不能拋出

  • Checked對(duì)比Unchecked Exception

一種普遍的說(shuō)法是,RuntimeException(unchecked)表示編程的邏輯錯(cuò)誤梢褐, 編程時(shí)應(yīng)該檢查以避免這些錯(cuò)誤旺遮,比如說(shuō)像空指針異常,如果真的出現(xiàn)了這些異常盈咳,程序退出也是正常的耿眉,程序員應(yīng)該檢查程序代碼的bug而不是想辦法處理這種異常。Checked exception表示程序本身沒(méi)問(wèn)題鱼响,但由于I/O鸣剪、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等其他不可預(yù)測(cè)的錯(cuò)誤導(dǎo)致的異常丈积,調(diào)用者應(yīng)該進(jìn)行適當(dāng)處理筐骇。

無(wú)論是checked還是unchecked異常,無(wú)論是否出現(xiàn)在throws聲明中江滨,我們都應(yīng)該在合適的地方以適當(dāng)?shù)姆绞竭M(jìn)行處理
其實(shí)觀點(diǎn)本身并不太重要拥褂,更重要的是項(xiàng)目中的一致性

如何使用異常

  • 異常應(yīng)該且僅用于異常情況
  • 異常處理的目標(biāo)
    用戶
    如果用戶輸入不對(duì),可能提示用戶具體哪里輸入不對(duì)牙寞,如果是編程錯(cuò)誤饺鹃,可能提示用戶系統(tǒng)錯(cuò)誤莫秆、建議聯(lián)系客服,如果是第三方連接問(wèn)題悔详,可能提示用戶稍后重試
    程序員
    他們一般不關(guān)心用戶輸入錯(cuò)誤镊屎,而關(guān)注編程錯(cuò)誤或第三方錯(cuò)誤,對(duì)于這些錯(cuò)誤茄螃,需要報(bào)告盡量完整的細(xì)節(jié)缝驳,包括異常鏈、異常棧等归苍,以便盡快定位和解決問(wèn)題用狱。
    第三方
    一般都是難以通過(guò)程序自動(dòng)解決的,第三方錯(cuò)誤則可能可以拼弃,甚至很多時(shí)候夏伊,程序都不應(yīng)該假定第三方是可靠的,應(yīng)該有容錯(cuò)機(jī)制吻氧。 比如說(shuō)溺忧,某個(gè)第三方服務(wù)連接不上(比如發(fā)短信),可能的容錯(cuò)機(jī)制是盯孙,換另一個(gè)提供同樣功能的第三方試試鲁森,還可能是,間隔一段時(shí)間進(jìn)行重試振惰,在多次失敗之后再報(bào)告錯(cuò)誤歌溉。
  • 異常處理的一般邏輯
    如果自己知道怎么處理異常,就進(jìn)行處理骑晶,如果可以通過(guò)程序自動(dòng)解決研底,就自動(dòng)解決,如果異惩赴眨可以被自己解決榜晦,就不需要再向上報(bào)告
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羽圃,隨后出現(xiàn)的幾起案子乾胶,更是在濱河造成了極大的恐慌,老刑警劉巖朽寞,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识窿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脑融,警方通過(guò)查閱死者的電腦和手機(jī)喻频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肘迎,“玉大人甥温,你說(shuō)我怎么就攤上這事锻煌。” “怎么了姻蚓?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵宋梧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狰挡,道長(zhǎng)捂龄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任加叁,我火速辦了婚禮倦沧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘它匕。我一直安慰自己展融,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布超凳。 她就那樣靜靜地躺著愈污,像睡著了一般耀态。 火紅的嫁衣襯著肌膚如雪轮傍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天首装,我揣著相機(jī)與錄音创夜,去河邊找鬼。 笑死仙逻,一個(gè)胖子當(dāng)著我的面吹牛驰吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播系奉,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檬贰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缺亮?” 一聲冷哼從身側(cè)響起翁涤,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萌踱,沒(méi)想到半個(gè)月后葵礼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡并鸵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年鸳粉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片园担。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡届谈,死狀恐怖枯夜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疼约,我是刑警寧澤卤档,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站程剥,受9級(jí)特大地震影響劝枣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜织鲸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一舔腾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搂擦,春花似錦稳诚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至橱夭,卻和暖如春氨距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棘劣。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工俏让, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茬暇。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓首昔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親糙俗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勒奇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容