錯誤是代碼無法真正解決的,如Error(內存溢出、棧溢出等jvm層面問題)及資源耗盡、配置錯誤、權限不足等根本性問題。1. error表示嚴重問題,程序無法恢復,不推薦捕獲;2. 資源耗盡類問題需運維介入而非代碼處理;3. 配置錯誤應修正配置而非臨時處理;4. 權限問題需人工授權;5. 外部服務故障應記錄日志并停止流程,而非無限重試。這些問題本質無法靠try-catch解決,需系統設計和運維保障。
在程序運行過程中,Error 和 Exception 都是表示“出了問題”的情況,但它們的性質和處理方式完全不同。簡單來說:
- Exception(異常) 是可以被捕獲并處理的,屬于程序運行中可以預料的問題;
- Error(錯誤) 則通常是嚴重的問題,程序本身無法恢復或處理,比如內存溢出、棧溢出等。
如果你想知道哪些“錯誤”是代碼無法捕獲的,那就要從 Error 說起。
什么是 Error?為什么它不能被輕易捕獲?
Error 表示的是 JVM(Java 虛擬機)層面的嚴重問題,通常意味著程序已經無法繼續執行下去了。比如:
這些問題不是由你的代碼邏輯直接引發的,而是運行環境出現了不可恢復的故障。雖然技術上你可以用 try-catch 捕獲 Error,但在實際開發中不推薦這么做。因為即使你捕獲了,也很難讓程序恢復正常運行。
舉個例子:就像汽車引擎爆炸了,你按喇叭是沒有用的。
Exception 分為哪兩類?怎么處理更合理?
Exception 又分為兩種類型:
-
Checked Exception(受檢異常)
這些異常必須在編譯時處理,否則代碼無法通過編譯。例如:- IOException
- SQLException
處理建議:要么 try-catch 捕獲,要么 throws 拋給調用者。
-
Unchecked Exception(非受檢異常)
這些異常繼承自 RuntimeException,編譯器不會強制你處理。例如:- NullPointerException
- ArrayIndexOutOfBoundsException
處理建議:這類異常通常是由于代碼邏輯錯誤引起的,應該在編寫階段就避免,而不是靠 catch 來兜底。
哪些錯誤是代碼無法真正解決的?
除了上面提到的 Error 類型外,還有一些“錯誤”雖然不屬于 Error,但也很難通過代碼徹底解決:
這些情況雖然可能拋出的是 Exception,但本質上是你無法通過代碼來修復的根本性問題。這時候更合適的應對方式是:
- 記錄日志
- 提醒人工介入
- 停止部分功能甚至整個流程
總結一下:哪些問題你不該試圖捕獲?
簡單總結幾個不該捕獲或無法真正解決的情況:
- 捕獲 Error(如 OutOfMemoryError)
- 捕獲所有異常的大范圍 catch(catch (Exception e))
- 對配置錯誤、權限問題做臨時處理而不改根本配置
- 對外部服務失敗無限重試而不停止流程
這些問題往往不是靠 try-catch 就能搞定的,而是需要從系統設計、運維保障上去解決。
基本上就這些。