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