JAVA異常和自定義異常處理方式
廢話前言
作為一個碼農(nóng)想必對異常這一塊滴已經(jīng)是相當熟悉了就是我們常說的try/catch/finally嗎,然后拋出捕獲的異常信息,那么當我們在開發(fā)中有些異常需要我們給出特定的提示統(tǒng)一對異常進行處理展示可能就會用到自定義異常。
第一:先說一下平時常用常見的異常
(1)運行時異常(checked exception)
繼承自java.lang. RuntimeException類
常見5種:
ClassCastException
(類型轉(zhuǎn)換異常)IndexOutOfBoundsException
(數(shù)組越界)NullPointerException
(空指針)ArrayStoreException
(數(shù)據(jù)存儲異常,操作數(shù)組時類型不一致)BufferOverflowException
(IO操作的異常)
(2)非運行時異常(unchecked exception)
繼承自java.lang.Exception類
常見:
Java.lang.ClassNotFoundException Java.lang.NoSuchMetodException java.io.IOException
先給出語法:
try{ //try塊中放可能發(fā)生異常的代碼。 //如果執(zhí)行完try且不發(fā)生異常,則接著去執(zhí)行finally塊和finally后面的代碼(如果有的話)。 //如果發(fā)生異常,則嘗試去匹配catch塊。 }catch(SQLException SQLexception){ //每一個catch塊用于捕獲并處理一個特定的異常,或者這異常類型的子類。Java7中可以將多個異常聲明在一個catch中。 //catch后面的括號定義了異常類型和異常參數(shù)。如果異常與之匹配且是最先匹配到的,則虛擬機將使用這個catch塊來處理異常。 //在catch塊中可以使用這個塊的異常參數(shù)來獲取異常的相關信息。異常參數(shù)是這個catch塊中的局部變量,其它塊不能訪問。 //如果當前try塊中發(fā)生的異常在后續(xù)的所有catch中都沒捕獲到,則先去執(zhí)行finally,然后到這個函數(shù)的外部caller中去匹配異常處理器。 //如果try中沒有發(fā)生異常,則所有的catch塊將被忽略。 }catch(Exception exception){ //… }finally{ //finally塊通常是可選的。 //無論異常是否發(fā)生,異常是否匹配被處理,finally都會執(zhí)行。 //一個try至少要有一個catch塊,否則, 至少要有1個finally塊。但是finally不是用來處理異常的,finally不會捕獲異常。 //finally主要做一些清理工作,如流的關閉,數(shù)據(jù)庫連接的關閉等。 }
代碼例子:
public class Class1 { public static void main(String[] args) throws Exception { try { List<String> list = new ArrayList<String>(); Class2 c = new Class2(); c.aa(list); System.out.println("打印"); }catch(Exception e) { System.out.println(">>>>>>>>>>>main"); e.printStackTrace(); }finally { System.out.println("main finally"); } } } public class Class2 { public String aa(List<String> list) throws Exception{ try { list.get(10); }catch(Exception e) { System.out.println(">>>>>>class2 aa="+e.getMessage()); e.printStackTrace(); throw e; //必須throw調(diào)用方法還會停止向下運行,并被調(diào)用方法接住并拋出 }finally { System.out.println("finally"); } return null; } }
第二:說一下我用到的自定義異常
自定義異常的好處是什么?
(1)統(tǒng)一了對外異常展示的方式給前臺或者各個服務接口
(2)使用自定義異常繼承相關的異常來拋出處理后的異常信息可以隱藏底層的異常,這樣更安全,異常信息也更加的直觀
我是如何在項目中使用的場景?
直接上代碼
一:自定義異常類
public class ExceptionMessage extends Exception { public ExceptionMessage(String message) { super(message); } }
二:自定義異常處理類
@RestControllerAdvice public class MyExceptionHandler { @ExceptionHandler(ExceptionMessage.class) public String handlerMyException(ExceptionMessage ex) { //BaseRspsMsg自定義錯誤代碼 BaseRspsMsg baseRspsMsg = BaseRspsMsg.build(BaseRspsMsg.BIZ_CODE_00001_FAILE,ex.getMessage()); return baseRspsMsg.toJsonStr(); } }
三:代碼調(diào)用
boolean isTrue = 處理邏輯是否符合;
if (!isTrue) { errDesc = "ERROR_異常信息描述!" ; throw new ExceptionMessage(errDesc); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring?Data?JPA命名約定查詢實現(xiàn)方法
這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Java中計算集合中元素的出現(xiàn)次數(shù)統(tǒng)計
本文主要介紹了Java中計算集合中元素的出現(xiàn)次數(shù)統(tǒng)計,使用Collections類配合HashMap來統(tǒng)計和java lamb 計算這兩種方式,具有一定的參考價值,感興趣可以了解一下2024-02-02