優(yōu)雅編程之這樣處理異常,你就“正彻∠ⅲ”了(七)

開(kāi)心一笑

【一交警在開(kāi)罰單技潘,一男子叼著煙過(guò)來(lái)喊:你除了開(kāi)罰單還會(huì)干什么?
交警沒(méi)理睬千康,男子繼續(xù):有種拖走跋碛摹!
交警很憤怒拾弃,男子繼續(xù):有種拖走爸底!
交警忍無(wú)可忍拿出對(duì)講機(jī)豪椿,拖車時(shí)交 警和藹說(shuō):下午到五大隊(duì)來(lái)處理奔坟!
男子:關(guān)我鳥(niǎo)事携栋!車又不是我的!
說(shuō)完哼著小曲騎著電瓶車走了】

提出問(wèn)題

如何處理異常才能使代碼更簡(jiǎn)潔咳秉?婉支??

解決問(wèn)題

程序中進(jìn)程會(huì)出現(xiàn)異常澜建,如何優(yōu)雅處理它向挖,需要一定技巧,以下是來(lái)自《代碼整潔之道》的幾點(diǎn)總結(jié):

1)使用異常而非返回碼炕舵,這里的異常處理就是我們經(jīng)常寫(xiě)的try catch何之;

package com.hwy.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CodeCleanTest {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    public boolean eat(){

        boolean isCompleted = false;

        try{
            System.out.println("美味");
            isCompleted = true;
        }catch (Exception e){
            log.info(e.getMessage());
        }

        return isCompleted;
    }

}

2)不要返回null值:這樣的話調(diào)用者就要處理null,增加工作量幕侠;解決:拋出異车勖溃或者返回特例對(duì)象(利用Collections.emptyList());

錯(cuò)誤示例:

package com.hwy.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;

public class CodeCleanTest {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 約會(huì)
     */
    public void datWithGirl(){
        List<String> snacksList =  buySnacks();
        if(null != snacksList){
            List<String> litter =  eatSnacks(snacksList);
            dropLitter(litter);
        }
    }

    /**
     * 買零食(事實(shí)這些注釋都是不需要晤硕,只是為了大家理解)
     * @return
     */
    public List<String> buySnacks(){

        List<String> snacksList = new ArrayList<>();
        snacksList.add("牛奶");
        snacksList.add("巧克力");
        snacksList.add("土豆片");
        return snacksList;
    }

    /**
     * 吃零食(事實(shí)這些注釋都是不需要悼潭,只是為了大家理解)
     * @param snacks
     */
    public List<String> eatSnacks(List<String> snacks){
        if(null != snacks) {
            for (String snack : snacks) {
                System.out.println("一起吃" + snack);
            }
        }
        return snacks;
    }

    /**
     * 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
     * @param litter
     */
    public void dropLitter(List<String> litter){

        if(null != litter){
            for(String snack:litter){
                System.out.println("一起吃" + snack);
            }
        }
    }
}

正確示例:可看里面詳細(xì)的注釋舞箍,要有耐心哦舰褪!

package com.hwy.test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;

public class CodeCleanTest {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 約會(huì)
     */
    public void datWithGirl() throws Exception {
        List<String> snacksList =  buySnacks();
        /** 利用逆向思維,拋出一個(gè)業(yè)務(wù)異常疏橄,這里我只是用簡(jiǎn)單的exception代替 **/
        if(null == snacksList || snacksList.size() ==0){
            throw new Exception("你沒(méi)買到零食或買到的零食有問(wèn)題占拍,請(qǐng)檢查!");
        }
        /** 代碼執(zhí)行到這一步就說(shuō)明snacksList不為null捎迫,之后的所有
         * 操作都不用判斷snacksList是否為空 **/
        List<String> litter =  eatSnacks(snacksList);
        dropLitter(litter);
    }

    /**
     * 買零食(事實(shí)這些注釋都是不需要晃酒,只是為了大家理解)
     * @return
     */
    public List<String> buySnacks(){

        List<String> snacksList = new ArrayList<>();
        snacksList.add("牛奶");
        snacksList.add("巧克力");
        snacksList.add("土豆片");

        /** 在這里如果snacksList為空的話,可以用Collections.emptyList(),就不用
        ** 在上面處理異常了 **/
        //return Collections.emptyList()窄绒;
        return snacksList;
    }

    /**
     * 吃零食(事實(shí)這些注釋都是不需要贝次,只是為了大家理解)
     * @param snacks
     */
    public List<String> eatSnacks(List<String> snacks){
        for (String snack : snacks) {
            System.out.println("一起吃" + snack);
        }
        return snacks;
    }

    /**
     * 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
     * @param litter
     */
    public void dropLitter(List<String> litter){

        for(String snack:litter){
            System.out.println("扔掉垃圾:" + snack);
        }
    }
}

3)在方法中返回null值是很糟糕的彰导,但講null傳遞給其他方法就更糟糕了蛔翅,具體解決方法如下:

package com.hwy.test;

import org.junit.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;

public class CodeCleanTest {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) throws Exception {
        datWithGirl();
    }

    /**
     * 約會(huì)
     */
    public static void datWithGirl(){
        /** 這里返回為null **/
        List<String> snacksList =  buySnacks();
        /** 在吃零食方法中,需要處理異常 **/
        List<String> litter =  eatSnacks(snacksList);
        dropLitter(litter);
    }

    /**
     * 買零食(事實(shí)這些注釋都是不需要位谋,只是為了大家理解)
     * @return
     */
    public static List<String> buySnacks(){
        return null;
    }

    /**
     * 吃零食(事實(shí)這些注釋都是不需要山析,只是為了大家理解)
     * @param snacks
     */
    public static List<String> eatSnacks(List<String> snacks){


        /** 第一種處理方法 **/
//        if(null == snacks){
//            throw new NullPointerException("沒(méi)有零食吃!!!");
//        }

        /** 第二種處理方法, **/
        Assert.assertNotNull("沒(méi)有零食吃!!!",snacks);
        for (String snack : snacks) {
            System.out.println("一起吃" + snack);
        }
        return snacks;
    }

    /**
     * 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
     * @param litter
     */
    public static void dropLitter(List<String> litter){
        for(String snack:litter){
            System.out.println("一起吃" + snack);
        }
    }
}

運(yùn)行結(jié)果:

java.lang.AssertionError: 沒(méi)有零食吃!!!
at org.junit.Assert.fail(Assert.java:93)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertNotNull(Assert.java:526)
at com.hwy.test.CodeCleanTest.eatSnacks(CodeCleanTest.java:48)
at com.hwy.test.CodeCleanTest.datWithGirl(CodeCleanTest.java:23)
at com.hwy.test.CodeCleanTest.main(CodeCleanTest.java:13)

4)不管做哪種類型的應(yīng)用掏父,都應(yīng)該盡可能向用戶隱藏異常的發(fā)生笋轨,除非發(fā)生了不可挽救的狀況,這才是符合最小驚訝原則的設(shè)計(jì)

5)異常的信息應(yīng)該足夠充分(包含出錯(cuò)的位置以及原因)

6)避免使用可控異常(checked exception):因?yàn)樘幚硭鼈冃枰薷暮瘮?shù)頭(在每個(gè)調(diào)用該函數(shù)的函數(shù)添加throw Exception),違反了開(kāi)放-閉合原則翩腐;應(yīng)該使用不可控異常(runtime exception);

感悟.png

讀書(shū)感悟

來(lái)自《峰與谷》

  • 在我們的工作和生活中鸟款,每個(gè)人都會(huì)遭遇高峰和低谷,這是人生的常態(tài)茂卦。
  • 看著你所失去的何什,你就會(huì)跌入不幸的谷底;看著你所擁有的等龙,你就會(huì)處在幸福的高峰处渣。
  • 征服內(nèi)心的恐懼,就意味著你處在人生的高峰狀態(tài)蛛砰。
  • 上天之所以制造苦難罐栈,是為了喚醒你的覺(jué)知——要關(guān)注那些被你忽視的真相。
  • 通過(guò)制訂愿景來(lái)攀登高峰是一個(gè)好辦法泥畅。它能夠讓你產(chǎn)生一種渴望荠诬,并且愿意用自己的行動(dòng)把愿景變成現(xiàn)實(shí)。
  • 從高峰上迅速跌落低谷的原因位仁,往往是不了解真相的驕傲自滿柑贞;在低谷里無(wú)法重新振作的原因,往往是不了解真相的憂慮恐懼聂抢。
  • 高峰和低谷不僅是外部的順境和逆境钧嘶,更是你內(nèi)心深處的感覺(jué)和變化。
  • 每一個(gè)人選擇好心態(tài)的時(shí)候琳疏,就意味著他將要離開(kāi)人生的谷底有决。
  • 人生的高原期是用來(lái)休養(yǎng)生息、深思熟慮和自我更新的時(shí)期空盼。
  • 峰谷相連不分书幕。今日順境之錯(cuò),換得他日逆境揽趾;今日逆境之智台汇,換得他日順境。

其他

如果有帶給你一絲絲小快樂(lè)但骨,就讓快樂(lè)繼續(xù)傳遞下去励七,歡迎轉(zhuǎn)載智袭,點(diǎn)贊奔缠,頂,歡迎留下寶貴的意見(jiàn)吼野,多謝支持校哎!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闷哆,更是在濱河造成了極大的恐慌腰奋,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抱怔,死亡現(xiàn)場(chǎng)離奇詭異劣坊,居然都是意外死亡埃唯,警方通過(guò)查閱死者的電腦和手機(jī)族壳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)艾蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拭卿,“玉大人谨朝,你說(shuō)我怎么就攤上這事璃吧〉站溃” “怎么了递沪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵勇蝙,是天一觀的道長(zhǎng)沫勿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)味混,這世上最難降的妖魔是什么产雹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮惜傲,結(jié)果婚禮上洽故,老公的妹妹穿的比我還像新娘。我一直安慰自己盗誊,他們只是感情好时甚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哈踱,像睡著了一般荒适。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上开镣,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天刀诬,我揣著相機(jī)與錄音,去河邊找鬼邪财。 笑死陕壹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的树埠。 我是一名探鬼主播糠馆,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怎憋!你這毒婦竟也來(lái)了又碌?” 一聲冷哼從身側(cè)響起九昧,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毕匀,沒(méi)想到半個(gè)月后铸鹰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皂岔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹋笼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躁垛。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姓建,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缤苫,到底是詐尸還是另有隱情速兔,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布活玲,位于F島的核電站涣狗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舒憾。R本人自食惡果不足惜镀钓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镀迂。 院中可真熱鬧丁溅,春花似錦、人聲如沸探遵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箱季。三九已至涯穷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藏雏,已是汗流浹背拷况。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掘殴,地道東北人赚瘦。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奏寨,于是被迫代替她去往敵國(guó)和親起意。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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