異常處理不規矩,線上定位bug兩行淚

2021-12-20 我是程序汪

最近因為疫情導致程序汪在家開啟遠程辦工,晚上開心的寫著業務代碼的時候突然運營妹子找到我說線上出現了一個問題需要幫看看

然後就開啟查bug模式,比較悲劇的是生產環境操作不了程序汪沒權限,於是就根據日誌分析問題

就這麼一個異常,敏感信息我打碼,數據驗證功能很常見

其實解決線上問題 分析日誌是最佳手段,可惜很多開發日誌打的太粗糙

發起人:運營妹子或運維直接找到開發負責人

提供線索:截圖、業務操作場景、日誌等等,有時候日誌需要開發去線上抓

分析:根據提供線索,如通過日誌定位具體異常原因,一般悲劇發生這一環節,日誌看不懂,異常描述模糊

復現問題:在線下環境復現此問題,當然很多時候線下復現不出來

解決手段:定位出問題馬上解決,如代碼發布補丁或開關控制下,程序汪公司開發功能有個習慣對於有風險的功能都有降級開關,可以動態開關的

程式設計師一直都在解決bug的路上,線下環境當然很爽遇到問題都是習慣性的說一句:給我一個斷點,我馬上定位出來      關鍵線上環境是不能debug的哦

java程式設計師非常喜歡debug,大家都懂的,解決問題是真的又快又爽

今天不是來講怎麼debug,這是java程式設計師的基本素質,不會的可以錘一錘自己

先上幾個錯誤日誌例子

一個catch大蓋帽

try {
//代碼邏輯一

//代碼邏輯二

//代碼邏輯三

....

//代碼邏輯十

} catch (Exception e) {
LoggerUtil.error(e, LOGGER, "{0} error.", LOG_NAME);
}

很多程式設計師為了偷懶,用一個 大catch 蓋住所有異常,這是一個非常粗糙的異常處理,程序汪剛工作時很喜歡這樣寫代碼。寫代碼的人是爽了,可是定位線上問題的人就苦逼了。

JAVA的良苦用心,儘量細化你的異常

java運行時異常,RuntimeExecption在java.lang包下提供了大量類

1、ClassCastException(類轉換異常)

2、IndexOutOfBoundsException(數組越界)

3、NullPointerException(空指針,最討厭的異常)

4、ArrayStoreException(數據存儲異常,操作數組時類型不一致)

5、BufferOverflowException異常

等等.

程式設計師看到這些異常名,立刻知道發生了什麼,要的就是這個效果

java提供了大量的運行異常,我們自己的業務異常也像java一樣拼命繼承RuntimeExecption,這樣異常類不就爆炸了嗎

更好的辦法是定義一個運行異常然後通過枚舉去定義具體異常場景,廢話不多說上代碼案例

一個運行異常類

public class BizException extends RuntimeException {

/** 錯誤碼. */
private ErrorCodeEnum errorCode;
/** 詳細錯誤信息 */
private Map<String, String> errorMap = new HashMap<String, String>();
/**
* 帶參構造器.
* @param errorCode
*/
public BizException(ErrorCodeEnum errorCode) {
super(errorCode.getDesc());
this.setErrorCode(errorCode);
}

/**
* 帶參構造器.
* @param errorCode
* @param message
*/
public BizException(KbErrorCodeEnum errorCode, String message) {
super(StringUtils.isNotBlank(message) ? message : errorCode.getDesc());
this.setErrorCode(errorCode);
}

一個枚舉,用來定義具體錯誤碼

public enum ErrorCodeEnum {
SYS_ERROR("SYS_ERROR", "系統錯誤,請重試"),
ILLEGAL_ARGS("ILLEGAL_ARGS", "參數校驗錯誤"),

具體業務異常的錯誤碼一定要定義足夠詳細

錯誤例子   查詢失敗

QUERY_FAIL("QUERY_FAIL", "查詢失敗"),

正確例子  電影詳細查詢失敗,如果業務非常複雜可以繼續詳細此枚舉值 

MOVIE_DETAIL_QUERY_FAIL("MOVIE_DETAIL_QUERY_FAIL", "電影詳細查詢失敗"),

一個複雜業務的數據驗證可能有上百的錯誤碼枚舉值,

越具體越好,線上出現bug可以第一時間快速地位到具體模塊具體功能的甚至具體代碼,這樣就完美了

程序汪上次犯的錯誤就是異常碼定義了,但是多處異常代碼公用一個異常碼導致不能快速定位是那裡出了異常,只能通過分析整個邏輯代碼來判斷bug原因

下面偽代碼比上面異常一個catch處理就優秀多了,不足的是3處邏輯異常碼是一樣的

try {
//代碼邏輯一

throw new BizException(MOVIE_DETAIL_QUERY_FAIL);

//代碼邏輯二

throw new BizException(MOVIE_DETAIL_QUERY_FAIL);

//代碼邏輯三

throw new BizException(MOVIE_DETAIL_QUERY_FAIL);

}

catch (BizException e) {
LoggerUtil.error(e, LOGGER, "{0} error.", LOG_NAME);
}

catch (Exception e) {
LoggerUtil.error(e, LOGGER, "{0} error.", LOG_NAME);
}

不要用一個catch蓋所有異常

採用自定義異常+錯誤碼枚舉 的優雅方式

錯誤碼枚舉請定義足夠詳細

歡迎留言回復,你項目中異常處理是怎麼設計的

異常推薦文章

spring的全局自定義異常案例「完美攔截Controller層全部異常」

java開發中異常怎麼定義好 程式設計師:不知道

Java 處理異常 9 個最佳實踐,你知道幾個?

相關焦點

  • 美國駐華大使館也「兩行淚」了…
    「北京第三區交通委提醒您:道路千萬條,安全第一條;行車不規範,親人兩行淚。」因為過於洗腦令人印象深刻,這句臺詞很快也走進現實,先後出現在江蘇高速公路和上海部分計程車上。同日,@美國駐華大使館 在轉發@美國使館籤證處 發布的有關申請籤證所需材料信息時,回復道:「美國駐華大使館提醒您:提示千萬條,誠實第一條;材料不真實,拒籤兩行淚」,文首還加上了「流浪地球造句大賽」的熱搜。
  • 【法治宣傳一日一說法】司機貪飲一杯酒 親人悲流兩行淚
    【法治宣傳一日一說法】司機貪飲一杯酒 親人悲流兩行淚 2020-12-17 17:54 來源:澎湃新聞·澎湃號·政務
  • python異常處理與上下文管理器
    作者丨王翔丨來研丨清風Pythonpython異常處理
  • 《極品公子》葉河圖語錄:男人兩行淚,一行為蒼生,一行為美人
    葉河圖有這樣一句經典語錄:男人兩行淚,一行為蒼生,一行為美人。這讓筆者讀得有些悽婉,不過這其中更蘊含著無限的豪情,只屬於男人的豪情。在《極品公子》中,葉河圖這個人物隱藏得很深。男人兩行淚,一行為蒼生,一行為美人。而也葉河圖的兩行淚只為他的美人——楊凝冰,此生不悔!好了,就寫到這裡,謝謝大家!
  • C語言的那些小秘密之異常處理
    typedef void(*sig_t) ( int );  sig_t signal(int signum,sig_t handler);  把上面的函數原型拆分為了如上兩行代碼,現在我們分析下上面的兩行代碼。
  • python入門——Python中異常處理
    上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。第九部分.
  • 典型案例:Bug 9776608-多個用戶使用錯誤密碼登錄同一個用戶而造成的用戶無法登錄異常
    墨墨導讀:在Oracle 11g中,大量的登錄失敗可能會導致library cache lock;或者大量的使用同一用戶登錄且登錄失敗,導致用戶登錄hang的問題,本文記錄整個分析、處理過程二、問題處理過程及分析方法通過遠程,sqlplus / as sysdba對資料庫進行登錄,並進行檢查,資料庫運行正常,且資料庫中沒有異常的等待事件;根據客戶描述,通過wx用戶和客戶提供的密碼進行登錄,發現登錄出現hang住的情況,重新打開另外一個資料庫窗口,並對當前的阻塞進行排查:
  • 別把「拼假一時爽,失業兩行淚」不當回事
    從法律層面來看,勞動者依法享有休息和休假的權利,但是在請假上既要遵循實事求是的原則,更須遵守用人單位的規章制度而行。倘若偽造病假條請假後幹其它的事情,一旦構成「嚴重違犯勞動紀律,影響生產、工作秩序」的,用人單位就可以辭退處理,且自作聰明者也難以享受到相應賠償。  從情理角度來看,虛假請假本就是不誠信不道德的行為,即便再事出有因,也多有不妥。
  • 音樂藝考假期不練琴,開學兩行淚!
    還是約上三五好友,出去玩?擼串?吃火鍋?出門的那一刻突然意識到:我還要練琴。但問題的關鍵是你用在練琴上的時間真的多嗎?放假的第一天假期我要好好練琴,蕭邦李斯特造起來!暑期在家自主學習和練琴的小夥伴,中音階梯音樂藝考培訓班老師在這裡提醒大家:學琴千萬條,練琴第一條,暑期不練琴,開學兩行淚!
  • 保養不規範 下垂兩行淚 你的咪咪還堅挺嗎
    因此想要改善,唯一的方法就是選擇手術矯正,但是現如今手術方式很多,雙環法、垂直雙蒂法,但是這些手術方法需要切除大量乳房組織,術後提升效果差、瘢痕攣縮扭曲變形,青筋暴露等弊端明顯,好在現如今有了人工韌帶乳房提升術,不開刀就能置入長效吸收的人工韌帶,將下垂的組織收緊到胸壁,實現自然上提,術後形態美觀。
  • 代碼實踐 l 異常和錯誤的處理
    *因為程序邏輯問題引起的不可恢復的異常叫錯誤(BUG)。定義好這兩個概念後,大家可能會疑問為什麼要這樣定義,異常和錯誤在我們通用理解的意義上是一個同義詞,沒有本質的區別。Assert 這個關鍵字在C語言中很常見,本質上是用來處理程序設計中的錯誤,一旦出現斷言執行,函數提供者是沒有能力恢復這個問題的,需要調用方檢查問題,後面如果程序繼續運行下去,可能發生不可預知的問題。一旦執行到 Assert ,說明函數的調用方的程序是有bug的,沒有正確的使用函數,顯然是符合我們上面定義的錯誤概念。
  • 我的一年級:我把作業本撕了,帶著兩行淚去上學了。
    我記得很清楚,我剛開始學拼音時,中午的作業是把上午學習的拼音讀會,然後寫在本子上。吃過午飯我爸媽應該又去地裡做農活了,我自己在家讀寫。可是有幾個我不會讀也寫不成。 當時場景歷歷在目,我蹲在我家樓梯上面。寫了撕,撕了寫。
  • 【線上問題定位】Llvm庫ARM環境崩潰問題
    問題定位5. 源碼」問題現象本地編寫的demo, 在多線程組裝和運行JIT函數的過程中產生崩潰問題。崩潰的位置,處理的是什麼邏輯?處理ARM環境下,JIT重定向功能中 .eh_frame段的重定向功能。".eh_frame"段是用於異常處理,包含異常處理過程需要的幀信息。出現問題的代碼,影響的因素有哪些?".eh_frame段"的重定向功能影響因素是編譯器的大小代碼模型。
  • 「離」字飛花令,一曲離歌兩行淚
    離岸櫓聲驚漸遠,盈襟淚顆悽猶滴。——張孝祥《滿江紅·秋滿蘅皋》7.離愁晚如織,託酒與消磨。——趙長卿《水調歌頭·離愁晚如織》8. 少小離家老大回,鄉音無改鬢毛衰。——賀知章《回鄉偶書》9.離憂如長線,千裡縈我心。——張籍《憶遠曲》17. 離情兩飄斷,不異風中絲。——張籍《別段生》18. 離堂無留客,席上唯琴樽。——張籍《懷別》張籍19. 離別勿復道,所貴不相忘。
  • 9天後,別來無恙,再見淚兩行,三大星座不再躲避,只想好好愛你
    愛中的他們也一樣,不會馬上喜歡上人。 所以他們愛上別人後,會小心保護對方。 他們自己的性格,對對方笨拙的愛,可能會使他們倆產生矛盾。 也可以一下子和對方分手,但對他的感情是分不開的。 9天後,請不要平安地來。 再見,兩行眼淚。 天蠍座是不可避免的。 我只是想愛你。
  • 線索千萬條,全等第一條,看圖不仔細,唯有淚兩行
    線索千萬條,全等第一條,看圖不仔細,唯有淚兩行平行四邊形中的全等,往往隱藏於更多已知條件之中,四邊形的複雜度比起三角形來,要更上一層樓,找準已知條件描述的對象,認真仔細看圖,是解幾何題的關鍵。全等三個條件中,最難找的一條,一般都有線索可尋。
  • 教你寫 Bug,常見的 OOM 異常分析
    ,並且要求的內存還不小,比如 java.net.SocketInputStream.read0 會在棧上要求分配一個 64KB 的緩存(64位 Linux)1.3 解決方案修復引發無限遞歸調用的異常代碼, 通過程序拋出的異常堆棧,找出不斷重複的代碼行,按圖索驥,修復無限遞歸 Bug排查是否存在類之間的循環依賴(當兩個對象相互引用,在調用toString方法時也會產生這個異常)通過 JVM 啟動參數
  • 教你寫Bug,常見的 OOM 異常分析
    1.2 原因分析無限遞歸循環調用(最常見原因),要時刻注意代碼中是否有了循環調用方法而無法退出的情況native 代碼有棧上分配的邏輯,並且要求的內存還不小,比如 java.net.SocketInputStream.read0 會在棧上要求分配一個
  • 小心「拼假一時爽,失業兩行淚」
    小心「拼假一時爽,失業兩行淚」 新聞頻道來源:央視新聞 2019年04月29日 11:26 A-A+   這可謂「拼假一時爽,失業兩行淚」。
  • 選科選不好,填報淚兩行!不同選科組合的「奧秘」首度曝光
    山東省今年一段線449分,劃線標準從以往的1:1.1劃線變成了1:1.2劃線,前幾年滑檔人數控制在1.7-1.8萬,今年由於考生沒有填報經驗可以借鑑,很多考生的保底志願沒有填好,導致今年滑檔人數暴增,高達4.4萬。