在日常開發中我們難免會遇到各種各樣的異常問題的發生,但是任何異常如果都在異常可能會出現的地方直接去處理會讓業務邏輯顯得很臃腫,代碼看上去很冗餘。在開發Web應用程式時,異常處理是一項非常重要的任務。異常處理可以提高程式的健壯性和穩定性。Java後端開發人員可以設計一個統一的全局異常處理方案來解決異常 ...
在日常開發中我們難免會遇到各種各樣的異常問題的發生,但是任何異常如果都在異常可能會出現的地方直接去處理會讓業務邏輯顯得很臃腫,代碼看上去很冗餘。在開發Web應用程式時,異常處理是一項非常重要的任務。異常處理可以提高程式的健壯性和穩定性。Java後端開發人員可以設計一個統一的全局異常處理方案來解決異常處理的問題,避免代碼冗餘,提高開發效率。在本文中,我們將介紹如何設計Java後端的全局異常處理方案。
什麼是全局異常處理?
全局異常處理是一種將異常處理代碼從業務邏輯中分離出來的技術。
在這裡分兩種全局異常處理的方式:
一、在Java中,全局異常處理使用@ControllerAdvice註解定義一個全局的異常處理類。在該類中,使用@ExceptionHandler註解捕獲異常併進行處理。使用全局異常處理技術,可以統一處理異常,提高代碼的復用性,降低代碼的冗餘度。
如下:
// 全局異常處理類
@Slf4j
@RestControllerAdvice // @ResponseBody+@ControllerAdvice註解的結合體,@ControllerAdvice註解表示該類是全局異常處理類
public class ExceptionDeal {
// 根據括弧內的異常種類,全局如有相應的異常,則會被此註解捕獲,進行方法內的下一步操作
@ExceptionHandler(ArithmeticException.class)
public String exceptions(ArithmeticException e) {
log.info("全局異常:{}",e.getMessage());
return "演算法異常";
}
// 任何空指針異常會被該方法捕獲處理
@ExceptionHandler(NullPointerException.class)
public String exceptions1(NullPointerException e) {
log.info("全局異常:{}",e.getMessage());
return "空指針異常";
}
}
// 測試類
@RestController
@RequestMapping("/demo")
public class TestDemo {
@RequestMapping("/test")
public String getInfo(){
int a = 1/0;
return a+"";
}
@RequestMapping("/test1")
public String getInfos(){
String s=null;
BigDecimal bigDecimal = new BigDecimal(s);
return bigDecimal.toString();
}
}
二、利用面向切麵編程(AOP)可以更方便地實現Java後端的全局統一異常處理。我們可以通過AOP將異常處理代碼從業務邏輯代碼中分離出來,降低代碼耦合度,提高代碼的可維護性和可擴展性。
@Component
@Aspect
@Slf4j
public class Aspects {
// 切入點(此處TestDemo類下的所有方法被執行時,均會被切麵捕獲處理)
@Pointcut("execution(* com.demo.controller.TestDemo.*(..))")
public void pt() {
}
// 製作切麵
@Around("pt()")
public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
Object result;
try {
result = pjp.proceed();
log.info("信息是:{}", result);
} catch (Exception e) {
log.info("異常信息:{}", e.getMessage());
return "切麵捕獲異常成功!";
}
return result;
}
}
// 測試類
@RestController
@RequestMapping("/demo")
public class TestDemo {
@RequestMapping("/test")
public String getInfo(){
int a = 1/0;
return a+"";
}
@RequestMapping("/test1")
public String getInfos(){
String s=null;
BigDecimal bigDecimal = new BigDecimal(s);
return bigDecimal.toString();
}
}