日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

熟读《阿里巴巴java开发手册》(二、异常日志)

發(fā)布時(shí)間:2025/3/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 熟读《阿里巴巴java开发手册》(二、异常日志) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

(一) 異常處理

(二) 日志規(guī)約


(一) 異常處理

1. 【強(qiáng)制】 Java 類庫中定義的可以通過預(yù)檢查方式規(guī)避的 RuntimeException 異常不應(yīng)該通過 catch 的方式來處理,比如: NullPointerException, IndexOutOfBoundsException 等等。
說明: 無法通過預(yù)檢查的異常除外,比如,在解析字符串形式的數(shù)字時(shí), 可能存在數(shù)字格式錯(cuò)誤, 不得不
通過 catch NumberFormatException 來實(shí)現(xiàn)。
正例: if (obj != null) {...}
反例: try { obj.method(); } catch (NullPointerException e) {…}


2. 【強(qiáng)制】 異常不要用來做流程控制,條件控制。
說明: 異常設(shè)計(jì)的初衷是解決程序運(yùn)行中的各種意外情況,且異常的處理效率比條件判斷方式要低很多。


3. 【強(qiáng)制】 catch 時(shí)請分清穩(wěn)定代碼和非穩(wěn)定代碼,穩(wěn)定代碼指的是無論如何不會出錯(cuò)的代碼。對于非穩(wěn)定代碼的 catch 盡可能進(jìn)行區(qū)分異常類型,再做對應(yīng)的異常處理。
說明: 對大段代碼進(jìn)行 try-catch,使程序無法根據(jù)不同的異常做出正確的應(yīng)激反應(yīng),也不利于定位問題,這是一種不負(fù)責(zé)任的表現(xiàn)。
正例: 用戶注冊的場景中,如果用戶輸入非法字符, 或用戶名稱已存在, 或用戶輸入密碼過于簡單,在程序上作出分門別類的判斷,并提示給用戶。


4. 【強(qiáng)制】 捕獲異常是為了處理它,不要捕獲了卻什么都不處理而拋棄之,如果不想處理它,請將該異常拋給它的調(diào)用者。最外層的業(yè)務(wù)使用者,必須處理異常,將其轉(zhuǎn)化為用戶可以理解的內(nèi)容。


5. 【強(qiáng)制】 有 try 塊放到了事務(wù)代碼中, catch 異常后,如果需要回滾事務(wù),一定要注意手動(dòng)回滾事務(wù)。


6. 【強(qiáng)制】 finally 塊必須對資源對象、流對象進(jìn)行關(guān)閉,有異常也要做 try-catch。
說明: 如果 JDK7 及以上,可以使用 try-with-resources 方式。


7. 【強(qiáng)制】 不要在 finally 塊中使用 return。
說明: try 塊中的 return 語句執(zhí)行成功后,并不馬上返回,而是繼續(xù)執(zhí)行 finally 塊中的語句,如果此處存在 return 語句,則在此直接返回,無情丟棄掉 try 塊中的返回點(diǎn)。
反例:

private int x = 0; public int checkReturn() {try {// x 等于 1,此處不返回return ++x;} finally {// 返回的結(jié)果是 2return ++x;} }

8. 【強(qiáng)制】 捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類。
說明: 如果預(yù)期對方拋的是繡球,實(shí)際接到的是鉛球,就會產(chǎn)生意外情況。


9. 【強(qiáng)制】 在調(diào)用 RPC、二方包、或動(dòng)態(tài)生成類的相關(guān)方法時(shí),捕捉異常必須使用 Throwable類來進(jìn)行攔截。
說明: 通過反射機(jī)制來調(diào)用方法,如果找不到方法,拋出 NoSuchMethodException。什么情況會拋出NoSuchMethodError 呢?二方包在類沖突時(shí),仲裁機(jī)制可能導(dǎo)致引入非預(yù)期的版本使類的方法簽名不匹配,或者在字節(jié)碼修改框架(比如: ASM)動(dòng)態(tài)創(chuàng)建或修改類時(shí),修改了相應(yīng)的方法簽名。這些情況,即使代碼編譯期是正確的,但在代碼運(yùn)行期時(shí),會拋出 NoSuchMethodError。


10.【推薦】 方法的返回值可以為 null,不強(qiáng)制返回空集合,或者空對象等,必須添加注釋充分說明什么情況下會返回 null 值。
說明: 本手冊明確防止 NPE 是調(diào)用者的責(zé)任。即使被調(diào)用方法返回空集合或者空對象,對調(diào)用者來說,也并非高枕無憂,必須考慮到遠(yuǎn)程調(diào)用失敗、 序列化失敗、運(yùn)行時(shí)異常等場景返回 null 的情況。


11.【推薦】 防止 NPE,是程序員的基本修養(yǎng),注意 NPE 產(chǎn)生的場景:
1) 返回類型為基本數(shù)據(jù)類型, return 包裝數(shù)據(jù)類型的對象時(shí),自動(dòng)拆箱有可能產(chǎn)生 NPE。
反例: public int f() { return Integer 對象}, 如果為 null,自動(dòng)解箱拋 NPE。
2) 數(shù)據(jù)庫的查詢結(jié)果可能為 null。
3) 集合里的元素即使 isNotEmpty,取出的數(shù)據(jù)元素也可能為 null。
4) 遠(yuǎn)程調(diào)用返回對象時(shí),一律要求進(jìn)行空指針判斷,防止 NPE。
5) 對于 Session 中獲取的數(shù)據(jù),建議進(jìn)行 NPE 檢查,避免空指針。
6) 級聯(lián)調(diào)用 obj.getA().getB().getC();一連串調(diào)用,易產(chǎn)生 NPE。
正例: 使用 JDK8 的 Optional 類來防止 NPE 問題。


12.【推薦】 定義時(shí)區(qū)分 unchecked / checked 異常,避免直接拋出 new RuntimeException(),更不允許拋出 Exception 或者 Throwable,應(yīng)使用有業(yè)務(wù)含義的自定義異常。推薦業(yè)界已定義過的自定義異常,如: DAOException / ServiceException 等。


13.【參考】 對于公司外的 http/api 開放接口必須使用“錯(cuò)誤碼” ;而應(yīng)用內(nèi)部推薦異常拋出;跨應(yīng)用間 RPC 調(diào)用優(yōu)先考慮使用 Result 方式,封裝 isSuccess()方法、 “錯(cuò)誤碼” 、 “錯(cuò)誤簡短信息” 。
說明: 關(guān)于 RPC 方法返回方式使用 Result 方式的理由:
1)使用拋異常返回方式,調(diào)用方如果沒有捕獲到就會產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。
2)如果不加棧信息,只是 new 自定義異常,加入自己的理解的 error message,對于調(diào)用端解決問題的幫助不會太多。如果加了棧信息,在頻繁調(diào)用出錯(cuò)的情況下,數(shù)據(jù)序列化和傳輸?shù)男阅軗p耗也是問題。

14.【參考】 避免出現(xiàn)重復(fù)的代碼( Don't Repeat Yourself) ,即 DRY 原則。
說明: 隨意復(fù)制和粘貼代碼,必然會導(dǎo)致代碼的重復(fù),在以后需要修改時(shí),需要修改所有的副本,容易遺漏。必要時(shí)抽取共性方法,或者抽象公共類,甚至是組件化。
正例: 一個(gè)類中有多個(gè) public 方法,都需要進(jìn)行數(shù)行相同的參數(shù)校驗(yàn)操作,這個(gè)時(shí)候請抽取:
private boolean checkParam(DTO dto) {...}

(二) 日志規(guī)約

1. 【強(qiáng)制】 應(yīng)用中不可直接使用日志系統(tǒng)( Log4j、 Logback) 中的 API,而應(yīng)依賴使用日志框架SLF4J 中的 API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);


2. 【強(qiáng)制】 所有日志文件至少保存 15 天,因?yàn)橛行┊惓>邆湟浴爸堋?為頻次發(fā)生的特點(diǎn)。 網(wǎng)絡(luò)運(yùn)行狀態(tài)、安全相關(guān)信息、系統(tǒng)監(jiān)測、管理后臺操作、用戶敏感操作需要留存相關(guān)的網(wǎng)絡(luò)日志不少于 6 個(gè)月。


3. 【強(qiáng)制】 應(yīng)用中的擴(kuò)展日志( 如打點(diǎn)、臨時(shí)監(jiān)控、訪問日志等) 命名方式:appName_logType_logName.log。 logType:日志類型, 如 stats/monitor/access 等; logName:日志描述。這種命名的好處:通過文件名就可知道日志文件屬于什么應(yīng)用,什么類型,什么目的,也有利于歸類查找。
說明: 推薦對日志進(jìn)行分類, 如將錯(cuò)誤日志和業(yè)務(wù)日志分開存放,便于開發(fā)人員查看,也便于通過日志對系統(tǒng)進(jìn)行及時(shí)監(jiān)控。
正例: force-web 應(yīng)用中單獨(dú)監(jiān)控時(shí)區(qū)轉(zhuǎn)換異常,如: force_web_timeZoneConvert.log


4. 【強(qiáng)制】 在日志輸出時(shí),字符串變量之間的拼接使用占位符的方式。
說明: 因?yàn)?String 字符串的拼接會使用 StringBuilder 的 append()方式,有一定的性能損耗。使用占位符僅是替換動(dòng)作,可以有效提升性能。
正例: logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);


5. 【強(qiáng)制】 對于 trace/debug/info 級別的日志輸出,必須進(jìn)行日志級別的開關(guān)判斷。
說明: 雖然在 debug(參數(shù))的方法體內(nèi)第一行代碼 isDisabled(Level.DEBUG_INT)為真時(shí)( Slf4j 的常見實(shí)現(xiàn) Log4j 和 Logback),就直接 return,但是參數(shù)可能會進(jìn)行字符串拼接運(yùn)算。此外,如果debug(getName())這種參數(shù)內(nèi)有 getName()方法調(diào)用,無謂浪費(fèi)方法調(diào)用的開銷。
正例:

// 如果判斷為真,那么可以輸出 trace 和 debug 級別的日志 if (logger.isDebugEnabled()) {logger.debug("Current ID is: {} and name is: {}", id, getName()); }

6. 【強(qiáng)制】 避免重復(fù)打印日志,浪費(fèi)磁盤空間,務(wù)必在 log4j.xml 中設(shè)置 additivity=false。
正例: <logger name="com.taobao.dubbo.config" additivity="false">


7. 【強(qiáng)制】 異常信息應(yīng)該包括兩類信息:案發(fā)現(xiàn)場信息和異常堆棧信息。如果不處理,那么通過關(guān)鍵字 throws 往上拋出。
正例: logger.error(各類參數(shù)或者對象 toString() + "_" + e.getMessage(), e);


8. 【推薦】 謹(jǐn)慎地記錄日志。生產(chǎn)環(huán)境禁止輸出 debug 日志; 有選擇地輸出 info 日志; 如果使用 warn 來記錄剛上線時(shí)的業(yè)務(wù)行為信息,一定要注意日志輸出量的問題,避免把服務(wù)器磁盤撐爆,并記得及時(shí)刪除這些觀察日志。
說明: 大量地輸出無效日志,不利于系統(tǒng)性能提升,也不利于快速定位錯(cuò)誤點(diǎn)。 記錄日志時(shí)請思考:這些日志真的有人看嗎?看到這條日志你能做什么?能不能給問題排查帶來好處?


9. 【推薦】 可以使用 warn 日志級別來記錄用戶輸入?yún)?shù)錯(cuò)誤的情況,避免用戶投訴時(shí),無所適從。如非必要,請不要在此場景打出 error 級別,避免頻繁報(bào)警。
說明: 注意日志輸出的級別, error 級別只記錄系統(tǒng)邏輯出錯(cuò)、異常或者重要的錯(cuò)誤信息。

10.【推薦】 盡量用英文來描述日志錯(cuò)誤信息,如果日志中的錯(cuò)誤信息用英文描述不清楚的話使用中文描述即可,否則容易產(chǎn)生歧義。 【強(qiáng)制】 國際化團(tuán)隊(duì)或海外部署的服務(wù)器由于字符集問題,使用全英文來注釋和描述日志錯(cuò)誤信息。

?

總結(jié)

以上是生活随笔為你收集整理的熟读《阿里巴巴java开发手册》(二、异常日志)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。