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ù)來獲取異常的相關(guān)信息。異常參數(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主要做一些清理工作,如流的關(guān)閉,數(shù)據(jù)庫連接的關(guān)閉等。
}
代碼例子:
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)一了對外異常展示的方式給前臺或者各個服務(wù)接口
(2)使用自定義異常繼承相關(guān)的異常來拋出處理后的異常信息可以隱藏底層的異常,這樣更安全,異常信息也更加的直觀
我是如何在項目中使用的場景?
直接上代碼
一:自定義異常類
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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Data?JPA命名約定查詢實現(xiàn)方法
這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Java中計算集合中元素的出現(xiàn)次數(shù)統(tǒng)計
本文主要介紹了Java中計算集合中元素的出現(xiàn)次數(shù)統(tǒng)計,使用Collections類配合HashMap來統(tǒng)計和java lamb 計算這兩種方式,具有一定的參考價值,感興趣可以了解一下2024-02-02

