日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java中處理異常的9個最佳實踐

瀏覽:156日期:2022-09-05 14:10:01

Java中的異常處理不是一個簡單的話題。初學者很難理解,甚至有經驗的開發人員也會花幾個小時來討論應該如何拋出或處理這些異常。

這就是為什么大多數開發團隊都有自己的異常處理的規則和方法。如果你是一個團隊的新手,你可能會驚訝于這些方法與你之前使用過的那些方法有多么不同。

然而,有幾種異常處理的最佳方法被大多數開發團隊所使用。下面是幫助改進異常處理的9個最重要的方法。

1. 在Finally中清理資源或者使用Try-With-Resource語句

通常情況下,你在try中使用了一個資源,比如 InputStream ,之后需要關閉它。在這種情況下,一個常見的錯誤是在try的末尾關閉了資源。

public void doNotCloseResourceInTry() { FileInputStream inputStream = null; try {File file = new File('./tmp.txt');inputStream = new FileInputStream(file);// use the inputStream to read a file// do NOT do thisinputStream.close(); } catch (FileNotFoundException e) {log.error(e); } catch (IOException e) {log.error(e); }}

問題是,只要不拋出異常,這種方法就可以很好地運行。try內的所有語句都將被執行,資源也會被關閉。

但是你在try里調用了一個或多個可能拋出異常的方法,或者自己拋出異常。這意味著可能無法到達try的末尾。因此,將不會關閉這些資源。

所以應該將清理資源的代碼放入Finally中,或者使用Try-With-Resource語句。

使用Finally

相比于try,無論是在成功執行try里的代碼后,或是在catch中處理了一個異常后,Finally里的內容是一定會被執行的。因此,可以確保清理所有已打開的資源。

public void closeResourceInFinally() { FileInputStream inputStream = null; try {File file = new File('./tmp.txt');inputStream = new FileInputStream(file);// use the inputStream to read a file } catch (FileNotFoundException e) {log.error(e); } finally {if (inputStream != null) { try {inputStream.close(); } catch (IOException e) {log.error(e); }} }}

Java 7的Try-With-Resource語句

另一個選擇是Try-With-Resource語句,在 introduction to Java exception handling 中更詳細地說明了這一點。

如果你的資源實現了 AutoCloseable 接口,就可以使用它,這正是大多數Java標準資源所做的。當你在try子句中打開資源時,它將在try被執行后自動關閉,或者處理一個異常。

public void automaticallyCloseResource() { File file = new File('./tmp.txt'); try (FileInputStream inputStream = new FileInputStream(file);) {// use the inputStream to read a file } catch (FileNotFoundException e) {log.error(e); } catch (IOException e) {log.error(e); }} 2. 給出準確的異常處理信息

你拋出的異常越具體越好。一定要記住,一個不太了解你代碼的同事,也許幾個月后,需要調用你的方法,并且處理這個異常。

因此,請確保提供盡可能多的信息,這會使你的API更容易理解。因此,你方法的調用者將能夠更好地處理異常,或者通過額外的檢查來避免它。

所以,要盡量能更好地描述你的異常處理信息,比如用 NumberFormatException 代替 IllegalArgumentException ,避免拋出一個不具體的異常。

public void doNotDoThis() throws Exception { ...}public void doThis() throws NumberFormatException { ...} 3. 記錄你所指定的異常

當你在方法中指定一個異常時,你應該在Javadoc中記錄下它。這與前面提到的方法有著相同的目標:為調用者提供盡可能多的信息,這樣他們就可以避免異常或者更容易地處理異常。

因此,請確保在Javadoc中添加一個@throws 聲明,并描述可能導致的異常情況。

/** * This method does something extremely useful ... * * @param input * @throws MyBusinessException if ... happens */public void doSomething(String input) throws MyBusinessException { ...} 4. 使用描述性消息拋出異常

這一最佳實踐的理念與前兩個相似。但這一次,你不用給調用方法的人提供信息。異常消息會被所有人讀取,同時必須了解在日志文件或監視工具中報告異常時發生了什么。

因此,應該盡可能準確地描述問題,并提供相關的信息來了解異常事件。

別誤會,你不需要寫一段文字,而是應該用1-2個簡短的句子解釋異常的原因。這可以幫助開發團隊理解問題的嚴重性,同時也使你能夠更容易地分析任何服務事件。

如果拋出一個特定的異常,它的類名很可能已經描述了這種類型的錯誤。所以,你不需要提供很多額外的信息。一個很好的例子就是,當你以錯誤的格式使用字符串時,如NumberFormatException,它就會被類 java.lang.Long的構造函數拋出。

try { new Long('xyz');} catch (NumberFormatException e) { log.error(e);}

NumberFormatException已經告訴你問題的類型,所以只需要提供導致問題的輸入字符串。如果異常類的名稱不具有表達性,那么就需要提供必要的解釋信息。

17:17:26,386 ERROR TestExceptionHandling:52 - java.lang.NumberFormatException: For input string: 'xyz' 5. 最先捕獲特定的異常

大多數IDE都可以幫助你做到這點,當你試圖捕獲不確定的異常時,它會報告一個不可到達的代碼塊。

問題是只有第一個匹配到異常的catch語句才會被執行,所以,如果你最先發現IllegalArgumentException,你將永遠不會到達catch里處理更具體的NumberFormatException,因為它是IllegalArgumentException的一個子類。

所以要首先捕獲特定的異常類,并在末尾添加一些處理不是很具體異常的catch語句。

你可以在下面的代碼片段中看到這樣一個try-catch語句的示例。第一個catch處理所有NumberFormatExceptions異常,第二個catch 處理NumberFormatException異常以外的illegalargumentexception異常。

public void catchMostSpecificExceptionFirst() { try {doSomething('A message'); } catch (NumberFormatException e) {log.error(e); } catch (IllegalArgumentException e) {log.error(e) }} 6. 不要在catch中使用Throwable

Throwable 是exceptions 和 errors的父類。當然,你可以在catch子句中使用它,但其實你不應該這樣做。

如果你在catch子句中使用Throwable,它將不僅捕獲所有的異常,還會捕獲所有錯誤。JVM會拋出錯誤,這是應用程序不打算處理的嚴重問題。典型的例子是 OutOfMemoryError 或 StackOverflowError 。這兩種情況都是由應用程序控制之外的情況引起的,無法處理。

所以,最好不要在catch中使用Throwable,除非你完全確定自己處于一個特殊的情況下,并且你需要處理一個錯誤。

public void doNotCatchThrowable() { try {// do something } catch (Throwable t) {// don’t do this! }} 7. 不要忽略Exceptions

你是否曾經分析過只有用例的第一部分才被執行的bug報告嗎?

這通常是由一個被忽略的異常引起的。開發人員可能非常確信它不會被拋出,并添加一個無法處理或無法記錄它的catch語句。當你發現它的時候,你很可能就會明白一句著名的話“This will never happen”。

public void doNotIgnoreExceptions() { try {// do something } catch (NumberFormatException e) {// this will never happen }}

是的,你可能在分析一個不可能發生的問題。

所以,請千萬不要忽略一個例外。你不會知道代碼在將來會發生什么變化。有些人可能會刪除阻止異常事件的驗證,而沒有意識到這造成了問題。或者拋出異常的代碼被更改,現在拋出了同一個類的多個異常,而調用的代碼并不能阻止所有這些異常。

你至少應該寫一個日志信息,告訴每個人,需要檢查一下這個問題。

public void logAnException() { try {// do something } catch (NumberFormatException e) {log.error('This should never happen: ' + e); }} 8. 不要記錄和拋出一個異常

這可能是最常被忽略的。你可以在許多代碼片段或者庫文件里發現,有異常會被捕獲、記錄和重新拋出。

try { new Long('xyz');} catch (NumberFormatException e) { log.error(e); throw e;}

當它發生時記錄一個異常,然后重新拋出它,以便調用者能夠適當地處理它,這可能會很直觀。但是它會為同一個異常寫多個錯誤消息。

17:44:28,945 ERROR TestExceptionHandling:65 - java.lang.NumberFormatException: For input string: 'xyz'Exception in thread 'main' java.lang.NumberFormatException: For input string: 'xyz'at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Long.parseLong(Long.java:589)at java.lang.Long.(Long.java:965)at com.stackify.example.TestExceptionHandling.logAndThrowException(TestExceptionHandling.java:63)at com.stackify.example.TestExceptionHandling.main(TestExceptionHandling.java:58)

不添加任何額外的信息。正如在上述第4個中所解釋的那樣,異常消息應該描述異常事件。堆棧會告訴你在哪個類、方法和行中異常被拋出。

如果你需要添加額外的信息,應該捕獲異常并將其包裝在一個自定義的信息中。但要確保遵循下面的第9條。

public void wrapException(String input) throws MyBusinessException { try {// do something } catch (NumberFormatException e) {throw new MyBusinessException('A message that describes the error.', e); }}

因此,只需要捕獲一個你想要處理的異常,在方法中指定它,并讓調用者處理它。

9. 包裝異常

有時最好捕獲一個標準異常并將其封裝到一個定制的異常中。此類異常的典型例子是應用程序或框架特定的業務異常。這允許你添加額外的信息,并且也可以為異常類實現一個特殊的處理。

當你這樣做時,確保引用原始的異常處理。Exception類提供了一些特定的構造函數方法,這些方法可以接受Throwable作為參數。否則,你將丟失原始異常的堆棧跟蹤和消息,這將使你很難分析導致異常的事件。

public void wrapException(String input) throws MyBusinessException { try {// do something } catch (NumberFormatException e) {throw new MyBusinessException('A message that describes the error.', e); }} 總結

正如你所看到的,在拋出或捕獲異常時,有許多不同的事情需要考慮。以上大多數方法都可以提高代碼可讀性或API可用性。

異常通常是一個錯誤處理機制和一個通信媒介。因此,你應該確保同事一起討論想要應用的最佳實踐和方法,以便每個人都理解通用概念并以相同的方式使用它們。

來自:http://www.iteye.com/news/32623

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜久久久久| 视频一区国产视频| 香蕉久久国产| 视频在线在亚洲| 蜜桃av一区| 综合国产视频| 欧美久久精品一级c片| 精品日产乱码久久久久久仙踪林| 日韩美女国产精品| 欧美精品中文字幕亚洲专区| 欧美日韩va| 欧美激情日韩| 亚洲精品在线影院| 久久精品二区三区| 亚洲综合精品| 亚洲精品高潮| 国产激情精品一区二区三区| 久久精品国产99国产| 福利精品一区| 自由日本语亚洲人高潮| 免费在线成人网| 日韩精品高清不卡| 国产精品乱战久久久| 欧美激情国产在线| 亚洲欧洲另类| 国产精品久av福利在线观看| 高清久久一区| 蜜桃av一区二区在线观看| 91精品日本| 久久久精品久久久久久96| 中文在线不卡| 久久精品九色| 亚洲香蕉久久| 麻豆视频在线观看免费网站黄| 欧美日韩国产高清| 捆绑调教美女网站视频一区| 韩国精品主播一区二区在线观看 | 亚洲精品亚洲人成在线观看| 国产精品观看| 三级一区在线视频先锋| 91视频久久| 国产精品久久久久久久久免费高清 | 国产亚洲精品自拍| 久久国内精品| 亚洲在线一区| 99久久久国产精品美女| 国产麻豆精品久久| 视频一区欧美精品| 免费欧美一区| 亚洲综合电影| 美女久久久久久 | 欧美a在线观看| 在线综合亚洲| 在线成人动漫av| 黄毛片在线观看| 精品在线网站观看| 国产精品男女| 欧美偷窥清纯综合图区| 午夜性色一区二区三区免费视频| 九九久久婷婷| 欧美日韩国产综合网| 久久一区二区三区电影| 色天使综合视频| 久久影院一区| 久久国产亚洲| 亚洲国产专区| 五月天久久777| 91精品国产成人观看| 欧洲在线一区| 91精品福利| 男人的天堂久久精品| 亚洲精品黄色| 国产精品一级| 韩国久久久久久| 久久男女视频| 日av在线不卡| 欧美经典一区| 99久久亚洲精品| 亚洲1区在线观看| 国产精品蜜月aⅴ在线| 四虎8848精品成人免费网站| 成人看片网站| 日韩av免费大片| 欧美色图国产精品| 日韩福利视频导航| 97精品视频在线看| 国产亚洲在线观看| 91成人在线| 久久精品成人| 欧美另类中文字幕| 日韩精品影视| 日韩中文一区二区| 老色鬼精品视频在线观看播放| 私拍精品福利视频在线一区| 亚洲天堂日韩在线| 精品国产美女a久久9999| 欧美a级一区| 日韩精品欧美精品| 蜜臀国产一区| 亚洲精品精选| 色婷婷久久久| 久久字幕精品一区| 蜜桃一区二区三区在线观看| 黑森林国产精品av| 97久久中文字幕| 亚洲欧美日韩在线观看a三区| 久久天堂影院| 日韩精品免费视频一区二区三区| 神马日本精品| 四虎成人av| 鲁大师精品99久久久| 亚洲精品美女91| 日韩黄色大片| 精品久久精品| 国产欧美日韩精品高清二区综合区| 亚洲a一区二区三区| zzzwww在线看片免费| 欧美日韩午夜| 奇米亚洲欧美| 日韩欧美三区| 日韩午夜视频在线| 亚洲伊人精品酒店| 国产视频亚洲| 亚洲免费一区二区| 狠狠色综合网| 红桃视频国产精品| 久久精品国内一区二区三区水蜜桃| 国产精品一区二区av日韩在线| 综合激情在线| 日韩高清一区| 欧美一级二区| 国产精品最新| 国产精品地址| 国产伊人久久| 日韩不卡在线| av不卡在线看| 在线观看一区| 欧美日韩在线精品一区二区三区激情综合| 国产视频一区欧美| 亚洲图片久久| 国产精选久久| 日韩国产欧美| 999国产精品| 国产精品毛片在线看| 亚洲男人在线| 精品少妇一区| 欧美日韩一区二区三区视频播放| 亚洲手机视频| 男女性色大片免费观看一区二区 | 欧美日韩视频网站| 98精品久久久久久久| 免费亚洲婷婷| 香蕉视频亚洲一级| 国产精品毛片在线| 欧美日韩xxxx| 国精品一区二区三区| 亚洲网址在线观看| 国产999精品在线观看| 伊人久久亚洲热| 国产精品久久久久久久久久白浆| 日本高清不卡一区二区三区视频| 亚洲精品女人| 欧美理论视频| 免费一级欧美片在线观看网站| 欧美.日韩.国产.一区.二区| 欧美日韩91| 欧美天堂视频| 国产伦乱精品| 国产高清一区| 欧美丰满日韩| 欧美亚洲一区二区三区| 午夜视频精品| 欧美成人基地| 开心激情综合| 欧美有码在线| 亚洲精品伊人| 欧美日韩精品一本二本三本| 国产精品v一区二区三区| 中文不卡在线| 狠狠久久婷婷| 久久精品欧美一区| 久久精品国产一区二区| 亚洲精品一级| 亚洲欧美日韩综合国产aⅴ| 蜜臀国产一区| 精品网站aaa| 国产一卡不卡| 亚洲人成网站在线在线观看| 国产麻豆综合| 欧美日韩国产高清| 蜜桃国内精品久久久久软件9| 91av亚洲| 日本美女一区| 久久香蕉国产| 偷拍欧美精品| 香蕉久久国产| 久久亚洲一区| 日韩精品一二三区| 亚欧成人精品| 国产精品男女|