Spring中@ExceptionHandler注解的使用方式
1:@ExceptionHandler介紹
@ExceptionHandler注解我們一般是用來自定義異常的。
可以認(rèn)為它是一個異常攔截器(處理器)。
異常間的層次關(guān)系

2: @ExceptionHandler的使用
極簡測試,一共4個類
1、一個SpringBoot啟動類
2、一個控制層
3、一個異常處理類
4、一個service類
啟動類:ExceptionhandlerdemoApplication
package com.example.exceptionhandlerdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExceptionhandlerdemoApplication {
public static void main(String[] args) {
SpringApplication.run(ExceptionhandlerdemoApplication.class, args);
}
}異常處理類
package com.example.exceptionhandlerdemo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LogManager.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler({Exception.class}) //申明捕獲那個異常類
public String ExceptionDemo(Exception e) {
logger.error(e.getMessage(), e);
return "自定義異常返回";
}
}控制層TestControll
package com.example.exceptionhandlerdemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/yu")
public class TestControll {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private UserInfoSerimpl userInfoSerimpl;
@ResponseBody
@RequestMapping("/test")
public String test(){
logger.info("11111111111");
userInfoSerimpl.saveUserInfo();
logger.info("2222222222");
return "sdfsfs";
}
}業(yè)務(wù)層:UserInfoSerimpl
package com.example.exceptionhandlerdemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service("userInfoService")
public class UserInfoSerimpl {
private Logger logger = LoggerFactory.getLogger(UserInfoSerimpl.class);
public void saveUserInfo() {
logger.error("獲取用戶信息失敗");
test1();
logger.info("ddddddddd");
}
private void test1(){
logger.error("test1 失敗");
throw new RuntimeException();
}
}測試:http://localhost:8080/yu/test
輸出:自定義異常返回
關(guān)于ExceptionHandler定義的攔截器之間的優(yōu)先級
在GlobalExceptionHandler類中定義兩個攔截器
@ExceptionHandler({RuntimeException.class}) //申明捕獲那個異常類
public String RuntimeExceptionDemo(Exception e) {
logger.error(e.getMessage(), e);
return "運(yùn)行時異常返回";
}
@ExceptionHandler({NumberFormatException.class}) //申明捕獲那個異常類
public String NumberFormatExceptionDemo(Exception e) {
logger.error(e.getMessage(), e);
return "數(shù)字轉(zhuǎn)換異常返回";
}在UserInfoSerimpl的test1方法中定義一個數(shù)字轉(zhuǎn)換異常, 這個異常在運(yùn)行時異常之前出現(xiàn)。
private void test1(){
logger.error("test1 失敗");
String a = "123a";
Integer b = Integer.valueOf(a);
throw new RuntimeException();
}測試:http://localhost:8080/yu/test
輸出:自定義異常返回
結(jié)論:自定義的異常越詳細(xì),得到的異常結(jié)果就越詳細(xì)。
為什么不直接使用一個Exception完事
1:Exception什么的異常太過廣泛,我們直接拋出所有異常信息,對用戶而言是非常不友好的。
2:在事務(wù)管理里,如果我們自定義的異常繼承的是Exception, 則事務(wù)無效。如果我們是繼承RuntimeException,則不會 出現(xiàn)這個問題。
到此這篇關(guān)于Spring中@ExceptionHandler注解的使用方式的文章就介紹到這了,更多相關(guān)@ExceptionHandler注解的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring中的@ExceptionHandler注解統(tǒng)一異常處理詳解
- SpringMVC使用@ExceptionHandler注解在Controller中處理異常
- Spring的異常處理@ExceptionHandler注解解析
- 關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理
- Spring中@ExceptionHandler注解的工作原理詳解
- Spring @ExceptionHandler注解統(tǒng)一異常處理和獲取方法名
- Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常
- Spring中的@ExceptionHandler注解詳解與應(yīng)用示例
相關(guān)文章
Java項(xiàng)目打包發(fā)布到maven私倉常見的幾種方式
這篇文章主要介紹了項(xiàng)目打包發(fā)布到maven私倉常見的幾種方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
Knife4j?3.0.3?整合SpringBoot?2.6.4的詳細(xì)過程
本文要講的是?Knife4j?3.0.3?整合SpringBoot?2.6.4,在SpringBoot?2.4以上的版本和之前的版本還是不一樣的,這個也容易導(dǎo)致一些問題,本文就這兩個版本的整合做一個實(shí)戰(zhàn)介紹2022-09-09
IDEA中將SpringBoot項(xiàng)目提交到git倉庫的方法步驟
本文主要介紹了IDEA中將SpringBoot項(xiàng)目提交到git倉庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸)
這篇文章主要介紹了Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸),具有一定參考價值,這里給大家分享下,供朋友們參考。2017-10-10
springboot本地調(diào)試沒問題,打包運(yùn)行報錯原因及分析
這篇文章主要介紹了springboot本地調(diào)試沒問題,打包運(yùn)行報錯原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
SpringBoot獲取配置文件值和環(huán)境變量的方式
本文介紹了SpringBoot配置文件的基礎(chǔ)知識、使用@Value和@ConfigurationProperties注入配置值、使用Environment接口獲取環(huán)境變量、配置文件的Profile支持、高級用法如條件化配置和配置刷新機(jī)制、以及配置的最佳實(shí)踐建議,需要的朋友可以參考下2026-04-04
Java synchronized關(guān)鍵_動力節(jié)點(diǎn)Java學(xué)院整理
在java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。下面通過本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學(xué)習(xí)吧2017-05-05
springboot自定義redis-starter的實(shí)現(xiàn)
這篇文章主要介紹了springboot自定義redis-starter的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java編寫實(shí)現(xiàn)坦克大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了Java編寫實(shí)現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

