【優(yōu)雅編程之道】之異常的6點(diǎn)建議

開心一笑

【想來(lái)想去掂咒,還是努力掙錢更靠譜,不然心情不好時(shí)缘挑,只能買兩瓶啤酒醫(yī)一袋雞爪在路邊嗷嗷的哭集歇,努力掙錢的話,就能躺在幽美的山中溫泉里敷面膜止住眼淚语淘。努力掙錢我還可以去紐約哭鬼悠,去倫敦哭,去巴黎哭亏娜,去羅馬哭,邊瀟灑邊哭蹬挺,想怎么哭就怎么哭】

提出問(wèn)題

如何優(yōu)雅的寫異常???

唯美圖片

解決問(wèn)題

禁止捕獲非受檢異常

至于什么是受檢異常和非受檢異常维贺,我們不做討論。這里只具體說(shuō)明受檢和非受檢的具體事例

1)非受檢的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,
ArithmeticException(算術(shù)異常巴帮,除0溢出)

2)受檢:Exception,FileNotFoundException,IOException,SQLException.

例:

@Test
public void test(){
    try{
        
    }catch(ArrayOutOfBoundsException e){
         
    }catch(NullPointerException e){
        
    }
}

非受檢異常一般是由于程序員代碼邏輯或者其他所導(dǎo)致的溯泣,如:NullPointerException虐秋。責(zé)任方在程序員,程序員應(yīng)該去解決它垃沦,而不是交給Java編譯器去處理客给。所以上面例子中, ArrayOutOfBoundsException 和 NullPointerException 異常都是非受檢異常肢簿,不應(yīng)該捕獲靶剑。同時(shí),也不應(yīng)該在正常代碼中處理這種異常 池充。

對(duì)異常進(jìn)行分類處理

處理異常時(shí)桩引,開發(fā)人員經(jīng)常會(huì)通過(guò)捕獲Exception異常來(lái)解決代碼中拋出的所有異常。雖然無(wú)傷大雅收夸,但卻是不可取的坑匠,不利于判斷導(dǎo)致異常的原因。

try{
        .....
//錯(cuò)誤做法:直接用Exception攬括所有異常
}catch (Exception e){
    e.printStackTrace();
}

正確做法:

try{
     .....
}catch (FileNotFoundException e){
    logger.warn("文件找不到錯(cuò)誤卧惜,請(qǐng)排查");
    e.printStackTrace();
}catch (FileAlreadyExistsException e){
    logger.warn("文件已存在錯(cuò)誤厘灼,請(qǐng)排查");
    e.printStackTrace();
}

我們通過(guò)對(duì)異常進(jìn)行分類處理。當(dāng)異常發(fā)生時(shí)咽瓷,通過(guò)logger打日志设凹,就可以很清楚是文件找不到異常或者文件不存在異常忱详。

避免空的catch塊帶來(lái)的危險(xiǎn)

在捕獲異常后围来,如果在catch塊中,不做任何處理匈睁,是非常危險(xiǎn)的监透。程序出現(xiàn)問(wèn)題,我們又不做任何處理航唆,控制臺(tái)又不打印任何信息胀蛮,故意找虐的節(jié)奏。如:

try{
    ...
}catch(SomeException e){
    //捕獲異常糯钙,卻不做任何處理
}

封裝異常讓其更受用

閱讀異常有兩類人:開發(fā)人員和用戶粪狼。對(duì)于開發(fā)人員,查找問(wèn)題時(shí)需要查看堆棧信息任岸,而對(duì)于用戶再榄,更多的是了解具體的業(yè)務(wù)問(wèn)題。如果你把堆棧里的異常信息傳到前端展示給用戶看享潜,用戶肯定會(huì)蒙圈困鸥。解決辦法就是封裝異常

例:

public class AyTest {
    @Test
    public void test(File file){
        if(file.length() > 50000){
            throw new AyBussinessException("上傳文件過(guò)大,請(qǐng)重新上傳");
        }
    }
}

class AyBussinessException extends RuntimeException{

    AyBussinessException(){}

    AyBussinessException(String msg){
        super(msg);
    }
}

通過(guò)自己封裝業(yè)務(wù)異常類 AyBussinessException 剑按,方便用戶清楚異常信息疾就,同時(shí)開發(fā)人員在以后的業(yè)務(wù)異常中都可以拋出 AyBussinessException 澜术,統(tǒng)一代碼,容易理解猬腰。上面只是一個(gè)簡(jiǎn)單的異常類封裝鸟废,更加復(fù)雜和通用的異常類封裝,有興趣的可以自己去實(shí)現(xiàn)姑荷。

推薦異常和日志的配合使用

開發(fā)除了可以將異常打印到控制臺(tái)中方便查看盒延。但是一旦軟件部署到生產(chǎn)環(huán)節(jié)中,就沒(méi)有所謂的控制臺(tái)厢拭,一旦生產(chǎn)環(huán)節(jié)出現(xiàn)相應(yīng)的問(wèn)題兰英,就無(wú)從排查。因此供鸠,建議在catch中畦贸,多打印日志。如下:

try{
     .....
}catch (FileNotFoundException e){
    //紀(jì)錄到日志文件中
    logger.warn("文件找不到錯(cuò)誤楞捂,請(qǐng)排查");
    e.printStackTrace();
}catch (FileAlreadyExistsException e){
    logger.warn("文件已存在錯(cuò)誤薄坏,請(qǐng)排查");
    throw new AyBussinessException("文件已存在錯(cuò)誤,請(qǐng)排查");
}

這樣寨闹,系統(tǒng)就會(huì)將錯(cuò)誤信息記錄到相關(guān)的日志文件中胶坠,方便以后排查。

切勿把異常放置在循環(huán)體內(nèi)

try-catch語(yǔ)句本身性能不高繁堡,如果再放到循環(huán)體中沈善,無(wú)非是雪上加霜。因此在開發(fā)中椭蹄,我們要極力避免闻牡。

例:

for(int i=0;i<10;i++){
    try{
        
    }catch (Exception e){
        
    }
}

正確做法:

try{
    for(int i=0;i<10;i++){
        
    }
}catch (Exception e){

}

綜上所述:不要再循環(huán)體內(nèi)執(zhí)行復(fù)制,耗時(shí)的操作绳矩。

讀書感悟

來(lái)自《菊與刀》

  • 一個(gè)人要是有所畏懼罩润,那么他就不是神,也不是不可觸碰的存在了翼馆。
  • 雖然每個(gè)靈魂原本都閃耀著美德的光輝割以,如同一把新刀,但是应媚,如果不勤于磨礪严沥,它就會(huì)失去光澤。如他們所說(shuō)的"自身的銹跡"中姜,它和刀上的銹跡一樣有害消玄,因此人們必須像磨礪刀劍一樣對(duì)待自己的品行。光輝的靈魂一旦被銹跡掩飾,所有需要做的就是再磨礪一次莱找。
  • 人們只有自己具有堅(jiān)定不移的信仰,才會(huì)有不尋常的寬容嗜桌。

經(jīng)典故事

【一個(gè)小女孩趴在窗臺(tái)上奥溺,看窗外的人正埋葬她心愛的小狗,不禁淚流滿面骨宠,悲慟不已浮定。她的外祖父見狀,連忙引她到另一個(gè)窗口层亿,讓她欣賞他的玫瑰花園桦卒。果然小女孩的心情頓時(shí)明朗。老人托起外孫女的下巴說(shuō):“孩子匿又,你開錯(cuò)了窗戶方灾。”哲理:打開失敗旁邊的窗戶碌更,也許你就看到了希望裕偿。】

大神文章

[1] Robert C.Martin. Clean Code: A Handbook of Agile Software [M]. Prentice Hall PTR,2008:50-69
[2] 秦小波. 編寫高質(zhì)量代碼:改善Java程序的151個(gè)建議[M]. 北京:機(jī)械工業(yè)出版社痛单,2012:300-301
[3] 李剛.瘋狂Java講義(第2版):電子工業(yè)出版社嘿棘,2014:2
[4] 趙景暉.Java 程序設(shè)計(jì)[M]:北京機(jī)械工業(yè)出版社,2005:1-2
[5] 明日科技.Java從入門到精通(第3版)[M]:清華大學(xué)出版社旭绒,2014
[6] 李晉.Java的昨天鸟妙,今天和明天[J].信息與電腦,2011(1).
[7] 任哲.JAVA技術(shù)應(yīng)用基礎(chǔ)[M]:機(jī)械工業(yè)出版社,2009:4-6
[8] 董云錚挥吵,陳千重父,梅惠平.Java技術(shù)應(yīng)用[M]:清華大學(xué)出版社,2007:2
[9] 周志明.深入理解Java虛擬機(jī)[M]:機(jī)械工業(yè)出版社蔫劣,2011:6
[10] 李明坪郭,陳京民,陶飛飛.Java程序設(shè)計(jì)與應(yīng)用[M] :清華大學(xué)出版社脉幢,2010:3-4
[11] 鄭悅.2006:開源精彩一年[J].中國(guó)計(jì)算機(jī)用戶,2006(50).

其他

如果有帶給你一絲絲小快樂(lè)歪沃,就讓快樂(lè)繼續(xù)傳遞下去,歡迎點(diǎn)贊嫌松、頂沪曙、歡迎留下寶貴的意見、多謝支持萎羔!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末液走,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缘眶,老刑警劉巖嘱根,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異巷懈,居然都是意外死亡该抒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門顶燕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凑保,“玉大人,你說(shuō)我怎么就攤上這事涌攻∨芬” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵恳谎,是天一觀的道長(zhǎng)芝此。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惠爽,這世上最難降的妖魔是什么癌蓖? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮婚肆,結(jié)果婚禮上租副,老公的妹妹穿的比我還像新娘。我一直安慰自己较性,他們只是感情好用僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赞咙,像睡著了一般责循。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀操,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天院仿,我揣著相機(jī)與錄音,去河邊找鬼速和。 笑死歹垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颠放。 我是一名探鬼主播排惨,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碰凶!你這毒婦竟也來(lái)了暮芭?” 一聲冷哼從身側(cè)響起鹿驼,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辕宏,沒(méi)想到半個(gè)月后畜晰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞筐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年舷蟀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片面哼。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扫步,靈堂內(nèi)的尸體忽然破棺而出魔策,到底是詐尸還是另有隱情,我是刑警寧澤河胎,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布闯袒,位于F島的核電站,受9級(jí)特大地震影響游岳,放射性物質(zhì)發(fā)生泄漏政敢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一胚迫、第九天 我趴在偏房一處隱蔽的房頂上張望喷户。 院中可真熱鬧,春花似錦访锻、人聲如沸褪尝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)河哑。三九已至,卻和暖如春龟虎,著一層夾襖步出監(jiān)牢的瞬間璃谨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工鲤妥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佳吞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓旭斥,卻偏偏與公主長(zhǎng)得像容达,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垂券,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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