亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java異常設計:必須捕獲或聲明拋出=>代碼影響太大

Java異常設計:必須捕獲或聲明拋出=>代碼影響太大

BIG陽 2023-10-12 16:49:52
免責聲明:我來自 C# 世界,所以這個問題可能因我之前的經驗而有偏差我有一個初始化日志記錄的方法。如果失敗,應用程序的其余部分不應運行,因為對記錄器的任何調用都會拋出 NullPointerException。今天,我的代碼捕獲異常并通過 System.err 打印錯誤日志。對我來說,這是一個錯誤,它應該讓異常傳播直到它殺死應用程序。因此,我開始刪除 try catch,突然收到編譯器的抱怨,說我應該在調用此方法的整個堆棧上聲明我的異常。我理解它背后的邏輯,并且發現它很實用:你知道這種方法是如何失敗的。然而,就責任分離而言,這對我來說聽起來并不正確。我不希望上層意識到這種潛在的 IOException 失敗,這是一種非常特殊的行為,例如 main 方法不應該知道。而且,如果我們推動這個邏輯,那就意味著:最高層最終必須聲明異常的整個范圍(從 IO 到網絡再到自定義異常......)任何新異常的添加都可能會影響大量文件和代碼我是否遺漏了什么或者這是預期的異常設計?
查看完整描述

3 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

我認為你正在尋找的不是 Java 異常,而是 Java 錯誤。

Error 是 Throwable 的子類,它指示合理的應用程序不應嘗試捕獲的嚴重問題。大多數此類錯誤都是異常情況。ThreadDeath 錯誤雖然是“正?!鼻闆r,但也是 Error 的子類,因為大多數應用程序不應嘗試捕獲它。

https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html

您可以拋出一個錯誤,這表明您的應用程序將不再工作,而您已將其聲明為正確的行為。


查看完整回答
反對 回復 2023-10-12
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

如果您無法初始化記錄器并且這是一個企業應用程序,我建議使用解釋原因的退出代碼來終止您的應用程序。如果這是客戶端應用程序,我建議向客戶端顯示一條消息,說明問題,建議客戶端向您報告此問題,并允許他們選擇是否繼續



查看完整回答
反對 回復 2023-10-12
?
米脂

TA貢獻1836條經驗 獲得超3個贊

您可以將檢查的異常封裝在 RuntimeException 中(如果是其子異常,則將其封裝在 RuntimeException 中),這不會強制您聲明異常:


public X execute() {

    try {

        return someThrowingMethod();

    } catch (Exception ex) {

        throw new RuntimeException(ex);

    }

}



查看完整回答
反對 回復 2023-10-12
  • 3 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號