官术网_书友最值得收藏!

5.4 異常鏈

應用程序通常會通過拋出另一個異常來響應異常。實際上,第一個異常引起第二個異常,以此類推,這就是“異常鏈(Chained Exceptions)”。異常鏈有助于用戶知道什么時候一個異常會導致另一個異常。以下是Throwable中支持異常鏈的方法和構(gòu)造函數(shù):

· Throwable getCause()

· Throwable initCause(Throwable)

· Throwable(String, Throwable)

· Throwable(Throwable)

initCause和Throwable構(gòu)造函數(shù)的Throwable參數(shù)是導致當前異常的異常。getCause返回導致當前異常的異常,initCause設置當前異常的原因。

以下示例顯示如何使用異常鏈:

在此示例中,當捕獲到IOException時將創(chuàng)建一個新的SampleException異常,附加原始的異常原因,并將異常鏈拋出到下一個更高級別的異常處理程序。

5.4.1 訪問堆棧跟蹤信息

現(xiàn)在讓我們假設更高級別的異常處理程序想要以自己的格式轉(zhuǎn)儲堆棧跟蹤。

注意

堆棧跟蹤(stack trace)提供有關當前線程的執(zhí)行歷史信息,并列出在異常發(fā)生時調(diào)用的類和方法的名稱。堆棧跟蹤是一個有用的調(diào)試工具,通常在拋出異常時會使用。

在異常對象上調(diào)用getStackTrace方法可獲取堆棧跟蹤信息,代碼如下:

5.4.2 記錄異常日志

如果要記錄catch塊中所發(fā)生的異常,最好不要手動解析堆棧跟蹤并將輸出發(fā)送到System.err(),而是使用Java日志框架(比如java.util.logging)將日志的內(nèi)容輸出發(fā)送到文件。

以下是使用日志框架的示例:

java.util.logging是Java自身提供的日志框架。除此之外,業(yè)界還提供了諸如Log4j、Logback和SLF4J等第三方開源的日志框架。這些框架往往擁有比較好的性能。

· Log4j是Apache旗下的Java日志記錄工具,它是由Ceki Gülcü首創(chuàng)的。

· Log4j 2是Log4j的升級產(chǎn)品。

· Commons Logging是Apache基金會所屬的項目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名為Commons Logging。

· SLF4J(Simple Logging Facade for Java)類似于Commons Logging,是一套簡易Java日志門面,本身并無日志的實現(xiàn)。同樣也是Ceki Gülcü首創(chuàng)的。

· Logback是SLF4J的實現(xiàn),與SLF4J是同一個作者。

這些框架都能很好地支持UDP以及TCP協(xié)議。應用程序?qū)⑷罩緱l目發(fā)送到控制臺或文件系統(tǒng)。通常使用文件回收技術(shù)來避免日志填滿所有磁盤空間。

日志處理的最佳實踐之一是關閉生產(chǎn)中的大部分日志條目,因為磁盤I/O的成本很高。磁盤I/O不但會減慢應用程序的運行速度,還會嚴重影響可伸縮性。將日志寫入磁盤也需要較高的磁盤容量,當磁盤用完之后,就有可能會降低應用程序的性能。日志框架提供了在運行時控制日志記錄的選項,以限制必須打印的內(nèi)容以及不打印的內(nèi)容。這些框架中的大部分都對日志記錄控件提供了細粒度的控制,還提供了在運行時更改這些配置的選項。

另外,日志可能包含重要的信息,如果分析得當,那么可能具有很高的價值。因此,限制日志條目本質(zhì)上限制了我們理解應用程序行為的能力。所以,日志是一把雙刃劍。

主站蜘蛛池模板: 瓮安县| 永清县| 罗江县| 凤翔县| 姚安县| 改则县| 天津市| 塔河县| 六安市| 泉州市| 永泰县| 沛县| 安平县| 台南市| 昭苏县| 崇州市| 石城县| 离岛区| 百色市| 宿迁市| 子长县| 内乡县| 垣曲县| 平昌县| 舒兰市| 蒲江县| 合肥市| 姚安县| 兴安盟| 丹阳市| 湖州市| 称多县| 通化县| 宜阳县| 洱源县| 博湖县| 夏邑县| 武隆县| 千阳县| 资源县| 九龙县|