上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...
上下文異常中的上下文屬性
Allison Anders等人的《四個房間》(1995)。
我不斷重復(fù)同樣的錯誤。
因此,該停止并制定規(guī)則以防止這種情況了。
錯誤不是致命的,但很煩人。
當(dāng)查看生產(chǎn)日志時(shí),經(jīng)常會看到類似"File doesn't exist" ,并且我問自己:什么文件?
它應(yīng)該在哪里存在?
服務(wù)器嘗試使用它做什么?
崩潰前一秒鐘發(fā)生了什么?
日志中沒有答案,這完全是我的錯。
我要么1)不重新拋出,要么2)在不提供上下文的情況下重新拋出。
兩者都是錯的。
代碼如下所示:
if (!file.exists()) {throw new IllegalArgumentException("File doesn't exist"); }它也可能看起來像這樣:
try {Files.delete(file); } catch (IOException ex) {throw new IllegalArgumentException(ex); }這兩個示例都說明了處理涉及異常并報(bào)告異常的情況的風(fēng)格不足。 怎么了 異常消息不夠徹底。 它們根本不包含來自其來源的任何信息。
他們應(yīng)該這樣看:
if (!file.exists()) {throw new IllegalArgumentException(String.format("User profile file %s doesn't exist",file.getAbsolutePath())); }第二個示例應(yīng)如下所示:
try {Files.delete(file); } catch (IOException ex) {throw new IllegalArgumentException(String.format("Can't delete user profile data file %s",file.getAbsolutePath()),ex); }看到不同? 這看起來像是冗余代碼,但事實(shí)并非如此。 當(dāng)然,當(dāng)我編寫所??有這些內(nèi)容時(shí),我并不真正在乎日志和異常。 我并不是真的希望這個文件不存在。
但是我應(yīng)該。
應(yīng)該有一條規(guī)則:每次我們拋出或重新拋出異常消息時(shí),都必須盡可能詳細(xì)地描述問題。
當(dāng)然,我們不能忘記安全性和冒著將任何敏感信息(例如密碼,信用卡號等)放入異常消息中的風(fēng)險(xiǎn)。此外,必須在更高級別上盡可能多地向異常捕獲程序公開這些信息。
拋出異常實(shí)際上是將問題升級到更高級別的管理。 想象一下,老板要我安裝新服務(wù)器。 幾小時(shí)后我回到他身邊說:“我失敗了;我失敗了。 抱歉。” 聽起來很奇怪。 他會要求更多細(xì)節(jié)。 為什么我失敗了? 到底出了什么問題? 可以做不同的事情嗎? 等等。
這樣的代碼實(shí)際上是對客戶不尊重的標(biāo)志:
throw new IllegalArgumentException("File doesn't exist" );我必須更加詳細(xì),并提供更多細(xì)節(jié)。
我不是一個人犯這個錯誤。 我到處都看到它,這確實(shí)使調(diào)試變得困難,尤其是在生產(chǎn)中,幾乎不可能立即重現(xiàn)該問題。
因此,請?jiān)谀漠惓O⒅懈釉敿?xì)。 我將在代碼中執(zhí)行相同的操作:)
還有一件事,然后再走。 在大多數(shù)OOP語言中,未檢查異常是不幸的 ,這意味著捕獲異常不是強(qiáng)制性操作。 盡管如此,我還是建議您始終捕獲,添加上下文并重新拋出它們。 這似乎是純噪聲,但事實(shí)并非如此! 只是使您的方法更小,并確保從它們發(fā)出的所有異常都具有有關(guān)其來源的足夠信息。 您將為自己和其他人帶來很大的幫助。
翻譯自: https://www.javacodegeeks.com/2015/12/throwing-exception-without-proper-context-bad-habit.html
上下文異常中的上下文屬性
總結(jié)
以上是生活随笔為你收集整理的上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公安部赵光明:自动驾驶汽车在产品设计阶段
- 下一篇: swarm 和 k8s_Wildfly