一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java異常處理的12條軍規總結

Java異常處理的12條軍規總結

2021-07-29 11:49張濤tom Java教程

這篇文章主要給大家介紹了關于Java異常處理的12條軍規,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

異常的概念

異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。

比如說,你的代碼少了一個分號,那么運行出來結果是提示是錯誤java.lang.error;如果你用system.out.println(11/0),那么你是因為你用0做了除數,會拋出java.lang.arithmeticexception的異常。

異常發生的原因有很多,通常包含以下幾大類:

•用戶輸入了非法數據。

•要打開的文件不存在。

•網絡通信時連接中斷,或者jvm內存溢出。

這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的。-

在java語言中,異常從使用方式上可以分為兩大類:

  • checkedexception
  • uncheckedexception

在java中類的異常結構圖如下:

Java異常處理的12條軍規總結

  1. 可檢查異常需要在方法上聲明,一般要求調用者必須感知異常可能發生,并且對可能發生的異常進行處理。可以理解成系統正常狀態下很可能發生的情況,通常發生在通過網絡調用外部系統或者使用文件系統時,在這種情況下,錯誤是可能恢復的,調用者可以根據異常做出必要的處理,例如重試或者資源清理等。
  2. 非檢查異常是不需要在throws子句中聲明的異常。jvm根本不會強制您處理它們,因為它們主要是由于程序錯誤而在運行時生成的。它們擴展了runtimeexception。最常見的例子是nullpointerexception 可能不應該重試未經檢查的異常,并且正確的操作通常應該是什么都不做,并讓它從您的方法和執行堆棧中出來。在高執行級別,應記錄此類異常。
  3. error是最為嚴重的運行時錯誤,幾乎是不可能恢復和處理,一些示例是outofmemoryerror,linkageerror和stackoverflowerror。它們通常會使程序或程序的一部分崩潰。只有良好的日志記錄練習才能幫助您確定錯誤的確切原因.

在異常處理時的幾點建議:

1永遠不要catch中吞掉異常,否則在系統發生錯誤時,你永遠不知道到底發生了什么

?
1
2
3
catch (someexception e) {
 return null;
}

2盡量使用特定的異常而不是一律使用exception這樣太泛泛的異常

?
1
public void foo() throws exception { //錯誤的做法}
?
1
public void foo() throws mybusinessexception1, mybusinessexception2 { //正確的做法}

        一味的使用exception,這樣就違背了可檢查異常的設計初衷,因為調用都不知道exception到底是什么,也不知道該如何處理。捕獲異常時,也不要捕獲范圍太大,例如捕獲exception,相反,只捕獲你能處理的異常,應該處理的異常。即然方法的聲明者在方法上聲明了不同類型的可檢查異常,他是希望調用者區別對待不同異常的。

3never catch throwable class

    永遠不要捕獲throwable,因為error也是繼承自它,error是jvm都處理不了的錯誤,你能處理?所以基于有些jvm在error時就不會讓你catch住。

4正確的封裝和傳遞異常

不要丟失異常棧,因為異常棧對于定位原始錯誤很關鍵

?
1
2
3
catch (someexception e) {
throw new myserviceexception("some information: " + e.getmessage()); //錯誤的做法
}

一定要保留原始的異常:

?
1
2
3
catch (someexception e) {
  throw new myserviceexception("some information: " , e); //正確的打開方式
}

5要打印異常,就不要拋出,不要兩者都做

?
1
2
3
4
catch (someexception e) {
  logger.error("some information", e);
throw e;
}

這樣的log沒有任何意義,只會打印出一連串的error log,對于定位問題無濟于事。

6不要在finally塊中拋出異常

如果在finally中拋出異常,將會覆蓋原始的異常,如果finally中真的可能會發生異常,那一定要處理并記錄它,不要向上拋。

7不要使用printstacktrace

要給異常添加上有用的上下文信息,單純的異常棧,沒有太大意義

8throw early catch late

異常界著名的原則,錯誤發生時及早拋出,然后在獲得所以全部信息時再捕獲處理.也可以理解為在低層次拋出的異常,在足夠高的抽象層面才能更好的理解異常,然后捕獲處理。

9對于使用一些重量級資源的操作,發生異常時,一定記得清理

如網絡連接,數據庫操作等,可以用try finally來做clean up的工作。

10不要使用異常來控制程序邏輯流程

我們總是不經意間這么做了,這樣使得代碼變更丑陋,使得正常業務邏輯和錯誤處理混淆不清;而且也可能會帶來性能問題,因為異常是個比較重的操作。

11及早校驗用戶的輸入

在最邊緣的入口校驗用戶的輸入,這樣使得我們不用再更底層邏輯中處處校驗參數的合法性,能大大簡化業務邏輯中不必要的異常處理邏輯;相反,在業務中不如果擔心參數的合法性,則應該使用衛語句拋出運行時異常,一步步把對參數錯誤的處理推到系統的邊緣,保持系統內部的清潔。

12在打印錯誤的log中盡量在一行中包含盡可能多的上下文

?
1
2
logger.debug("enter a");
logger.debug("enter b"); //錯誤的方式
?
1
logger.debug("enter a, enter b");//正確的方式

thanks all. happy learning!!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。

原文鏈接:https://mp.weixin.qq.com/s/Oo53o8Qhiu8VHH70dTIOuA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青春娱乐国产分类精品二 | 国产精品国色综合久久 | 女人肮脏的交易中文字幕未删减版 | 色呦阁| 99久久香蕉国产综合影院 | 亚洲天堂.com | 男人的j放进女人的p全黄 | 日本九九视频 | 欧美日韩专区国产精品 | 午夜欧美精品久久久久久久久 | 蜜臀91| 手机看片国产自拍 | 日本色播 | 日本三级成人中文字幕乱码 | 明星裸乳照无奶罩 | 四虎新网站| 欧美a级在线 | 成人免费观看网欧美片 | 国产成人久久精品一区二区三区 | free性俄罗斯护士 | 国产成人在线播放 | 国产午夜精品福利久久 | 茄子视频懂你更多apl | 精品国产麻豆免费人成网站 | 男生和老师一起差差差 | 亚洲欧美专区精品伊人久久 | 狠狠色婷婷狠狠狠亚洲综合 | 欧美性黑人巨大gaysex | 99国产牛牛视频在线网站 | 成人午夜爽爽爽免费视频 | chinese男男gayxxx| 亚洲黄色三级视频 | 亚洲欧美日韩久久一区 | 深夜在线网址 | 97香蕉超级碰碰碰久久兔费 | 亚洲一二三区久久五月天婷婷 | 精品AV无码一二三区视频 | 丝瓜污污 | 91真人毛片一级在线播放 | 国产亚洲精品精品国产亚洲综合 | 性欧美高清强烈性视频 |