最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java代碼規(guī)范review異常事故記錄

 更新時間:2022年06月14日 09:58:50   作者:小姐姐味道  
這篇文章主要為大家介紹了java代碼規(guī)范關(guān)于異常review代碼發(fā)生異常的事故記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

不久之前,部門進行了一次代碼評審。

代碼整體比較簡單,該吹B的地方都已經(jīng)吹過了,無非是些if else的老問題而已。當翻到一段定時任務(wù)的一步執(zhí)行代碼時,我的雙眼一亮,覺得該BB兩句了。

誰知這群家伙,評審的時候滿滿的認同感,但評審結(jié)束不久,就給我冠了個事B的稱號。

今天我就把當時的這些話兒整理整理,讓大家說道說道,我到底是不是個事B。淦!

一個任務(wù)處理例子

代碼的結(jié)構(gòu)大體是這樣的。

通過定時,這段代碼每天晚上凌晨都要對數(shù)據(jù)庫的記錄進行一遍對賬。主要的邏輯,就是使用獨立的線程,漸進式的讀取數(shù)據(jù)庫中的相關(guān)記錄,然后把這些記錄,放在循環(huán)中逐條進行處理。

ExecutorService service = Executors.newFixedThreadPool(10);
...
service.submit(()->{
    while(true){
        if(CollectionUtils.isEmpty(items)){
            break;
        }
        List<Data> items = queryPageData(start, end); // 分頁邏輯
        for(Data item : items){
            try {
                Thread.sleep(10L);
            } catch (InterruptedException e) {
                //noop 
            }
            processItem(item);
        }
    }
});

等一下。在代碼馬上被翻過去的時候,我叫停了,這里的processItem沒有捕獲異常。

通常情況下,這不會有什么問題。但靜好的歲月,總是偶爾會被一些隨機的事故打斷。如果這是你任務(wù)的完整代碼,那它就有一種非常隱晦的故障處理方式。即使你的單元測試寫的再好,這段代碼我們依然可以通過遠程投毒的方式,通過問題記錄來讓它產(chǎn)生問題。

是的。以上代碼的根本原因,就是沒有捕捉processItem函數(shù)可能產(chǎn)生的異常。如果在記錄處理的時候,有任何一條拋出了異常,不管是checked異常還是unchecked異常,整個任務(wù)的執(zhí)行都會終止!

不要覺得簡單哦,踩過這個坑的同學,請記得扣個666?;蛘叻幌履愕娜蝿?wù)執(zhí)行代碼,看看是不是也有這個問題。

Java編譯器在很多情況下都會提示你把異常給捕捉了,但總有些異常會逃出去,比如空指針異常。如下圖,RuntimeException和Error都屬于unchecked異常。

RuntimeException可以不用try...catch進行處理,但是如果一旦出現(xiàn)異常,則會導致程序中斷執(zhí)行,JVM將統(tǒng)一處理這些異常。

你捕捉不到它,它自然會讓你的任務(wù)完蛋。

如果你想要異步的執(zhí)行一些任務(wù),最好多花一點功夫到異常設(shè)計上面。在這上面翻車的同學比比皆是,這輛車并不介意再帶上你一個。

評審的小伙很謙虛,馬上就現(xiàn)場修改了代碼。

不要生吞異常

且看修改后的代碼。

ExecutorService service = Executors.newFixedThreadPool(10);
...
service.submit(()->{
    while(true){
        if(CollectionUtils.isEmpty(items)){
            break;
        }
        List<Data> items = queryPageData(start, end); // 分頁邏輯
        for(Data item : items){
            try {
                Thread.sleep(10L);
            } catch (InterruptedException e) {
                //noop 
            }
            try{
                processItem(item);
            }catch(Exception ex){
                LOG.error(...,ex);
            }
        }
    }
});
...
service.shutdownNow();

為了控制任務(wù)執(zhí)行的頻率,sleep大法是個有效的方法。

代碼里考慮的很周到,按照我們上述的方式捕捉了異常。同時,還很貼心的把sleep相關(guān)的異常也給捕捉了。這里不貼心也沒辦法,因為不補齊這部分代碼的話,編譯無法通過,我們姑且認為是開發(fā)人員的水平夠?qū)拧?/p>

由于sleep拋出的是InterruptedException,所以代碼什么也沒處理。這也是我們代碼里常見的操作。不信打開你的項目,忽略InterruptedException的代碼肯定多如牛毛。

此時,你去執(zhí)行這段代碼,雖然線程池使用了暴力的shutdownNow函數(shù),但你的代碼依然無法終止,它將一直run下去。因為你忽略了InterruptedException異常。

當然,我們可以在捕捉到InterruptedException的時候,終止循環(huán)。

try {
    Thread.sleep(10L);
} catch (InterruptedException e) {
    break;
}

雖然這樣能夠完成預期,但一般InterruptedException卻不是這么處理的。正確的處理方式是這樣的:

while (true) {
    Thread currentThread = Thread.currentThread();
    if(currentThread.isInterrupted()){
        break;
    }
    try {
        Thread.sleep(1L);
    } catch (InterruptedException e) {
        currentThread.interrupt();
    }
}

除了捕捉它,我們還要再次把interrupt狀態(tài)給復位,否則它就隨著捕捉給清除了。InterruptedException在很多場景非常的重要。當有些方法一直阻塞著線程,比如耗時的計算,會讓整個線程卡在那里什么都干不了,InterruptedException可以中斷任務(wù)的執(zhí)行,是非常有用的。

但是對我們現(xiàn)在代碼的邏輯來說,并沒有什么影響。被評審的小伙伴不滿意的說。

還有問題!

有沒有影響是一回事,是不是好的習慣是另一回事 。我盡量的裝了一下B,其實,你的異常處理代碼里還有另外隱藏的問題。

還有什么問題?,大家都一改常日慵懶的表情,你倒是說說。

我們來看一下小伙伴現(xiàn)場改的問題。他直接使用catch捕獲了這里的異常,然后記錄了相應(yīng)的日志。我要說的問題是,這里的Exception粒度是不對的,太粗魯。

try{
    processItem(item);
}catch(Exception ex){
    LOG.error(...,ex);
}

processItem函數(shù)拋出了IOException,同時也拋出了InterruptedException,但我們都一致對待為普通的Exception,這樣就無法體現(xiàn)上層函數(shù)拋出異常的意圖。

比如processItem函數(shù)拋出了一個TimeoutExcepiton,期望我們能夠基于它做一些重試;或者拋出了SystemBusyExcption,期望我們能夠多sleep一會,給服務(wù)器一點時間。這種粗粒度的異常一股腦的將它們捕捉,在新異常添加的時候根本無法發(fā)現(xiàn)這些代碼,會發(fā)生風險。

一時間會議室里寂靜無比。

我覺得你說的很對 ,一位比較資深的老鳥說, 你的意思是把所有的異常情況都分別捕捉,進行精細化處理。但最后你還是要使用Exception來捕捉RuntimeException,異常還是捕捉不到啊。

果然是不同凡響的發(fā)問。

優(yōu)秀的、標準的代碼寫法,其中無法實施的一個重要因素,就是項目中的其他代碼根本不按規(guī)矩來。如果我們下層的代碼,進行了正確的空指針判斷、數(shù)組越界操作,或者使用類似guava的Preconditions這類API進行了前置的異常翻譯,上面的這種問題根本不用回答。

但上面這種代碼的情況,我們就需要手動的捕捉RuntimeException,進行單獨的處理。

你們這個項目,爛代碼太多了,所以不好改。我雖然有情商,但我更有脾氣。

大家不歡而散。

End

我實在是想不通,代碼review就是用來發(fā)現(xiàn)問題的。結(jié)果這review會一開下來,大家都在背后諷刺我。這到底是我的問題呢?還是這個團隊的問題呢?讓人搞不懂。

你們在糾結(jié)使用Integer還是int的時候,我也沒說什么呀,現(xiàn)在就談點異常處理的問題,就那么玻璃心受不了了。這B不能全都讓你們裝了啊。

什么?你要review一下我的代碼?看看我到底有沒有像我說的一樣寫代碼,有沒有以身作則?是在不好意思,我可是架構(gòu)師哎,我已經(jīng)很多年沒寫代碼了。

你的這個愿望讓你落空了!

以上就是java代碼規(guī)范review異常事故記錄的詳細內(nèi)容,更多關(guān)于java代碼規(guī)范review異常的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Jmeter壓力測試簡單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter壓力測試簡單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter是一個非常好用的壓力測試工具。Jmeter用來做輕量級的壓力測試,非常合適,本文詳細的介紹了Jmeter的使用,感性的可以了解一下
    2021-11-11
  • Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案

    Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案

    這篇文章主要給大家介紹了關(guān)于Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案,這個異常是java.net包中的一部分,具體說它是類的一個實例,異常通常是由主機名無法解析為IP地址引起的,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • SpringBoot實現(xiàn)微信小程序支付功能

    SpringBoot實現(xiàn)微信小程序支付功能

    小程序支付功能已成為眾多應(yīng)用的核心需求之一,本文主要介紹了SpringBoot實現(xiàn)微信小程序支付功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • java實現(xiàn)猜數(shù)字小游戲(Swing版)

    java實現(xiàn)猜數(shù)字小游戲(Swing版)

    這篇文章主要介紹了java實現(xiàn)猜數(shù)字小游戲,Swing編程版的猜數(shù)字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 為何Java8需要引入新的日期與時間庫

    為何Java8需要引入新的日期與時間庫

    這篇文章主要給大家介紹了關(guān)于Java8為什么需要引入新的日期與時間庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • JAVA連接到SQLserver的步驟方法以及遇到的問題

    JAVA連接到SQLserver的步驟方法以及遇到的問題

    java相對于其他語言(例如c,c++等)連接數(shù)據(jù)庫要方便得多,下面這篇文章主要給大家介紹了關(guān)于JAVA連接到SQLserver的步驟方法及遇到的問題,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理)

    Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理)

    這篇文章主要介紹了Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • java二叉樹面試題詳解

    java二叉樹面試題詳解

    下面小編就為大家?guī)硪黄猨ava二叉樹的幾道面試題詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • 手把手教你使用Java實現(xiàn)在線生成pdf文檔

    手把手教你使用Java實現(xiàn)在線生成pdf文檔

    在實際的業(yè)務(wù)開發(fā)的時候,常常會需要把相關(guān)的數(shù)據(jù)信息,通過一些技術(shù)手段生成對應(yīng)的PDF文件,然后返回給用戶。本文將手把手教大家如何利用Java實現(xiàn)在線生成pdf文檔,需要的可以參考一下
    2022-03-03
  • java bootclasspath的具體用法

    java bootclasspath的具體用法

    本文主要介紹了java bootclasspath的具體用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01

最新評論

香格里拉县| 吉木乃县| 宿州市| 老河口市| 富顺县| 仲巴县| 剑阁县| 济阳县| 金湖县| 永善县| 厦门市| 延长县| 南皮县| 微山县| 慈利县| 都匀市| 阿鲁科尔沁旗| 襄垣县| 富源县| 石门县| 公主岭市| 宁晋县| 房山区| 三台县| 中西区| 枣庄市| 庆城县| 萍乡市| 明星| 昌宁县| 城步| 金堂县| 乐业县| 措勤县| 柳江县| 隆尧县| 巴里| 平山县| 铁岭县| 准格尔旗| 灵宝市|