天天看點

Spring MVC中的異常處理

異常處理

  • ​​前言​​
  • ​​1. 基于配置的簡單異常處理​​
  • ​​2. 基于注解的全局異常處理​​

前言

我們在項目的開發中,難免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的代碼耦合度高,工作量大且不好統一,維護的工作量也很大。

那麼,能不能将所有類型的異常處理從各處理過程解耦出來,這樣既保證了相關處理過程的 功能較單一,也實作了異常資訊的統一處理和維護?答案是肯定的。下面将介紹Spring MVC是如何處理異常的。

1. 基于配置的簡單異常處理

在SpringMVC中擁有一套非常強大的異常處理機制,SpringMVC通過 HandlerExceptionResolver處理程式的異常,包括請求映射,資料綁定以及目标方法的執行時發生的異常。
Spring MVC中的異常處理

SpringMVC提供了一個處理控制器方法執行過程中所出現的異常的接口:

HandlerExceptionResolver,該接口的實作類有:DefaultHandlerExceptionResolver和

SimpleMappingExceptionResolver,下面就來看看如何使用簡單異常處理器來處理異常。

使用 Spring MVC 提供的簡單異常處理器 SimpleMappingExceptionResolver

​Spring MVC配置檔案​

<!--配置異常處理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
        <!--ArithmeticException算術運算異常:是出現異常的運算條件時,抛出此異常-->
            <prop key="java.lang.ArithmeticException">error</prop>
        </props>
    </property>
    <property name="exceptionAttribute" value="e"/>
</bean>      

注意:

  • properties的鍵表示處理器方法執行過程中出現的異常
  • properties的值表示若出現指定異常時,設定一個新的視圖名稱,跳轉到指定頁面
  • exceptionAttribute屬性設定一個屬性名,将出現的異常資訊在請求域中進行共享

​控制器方法​

@RequestMapping("/testException")
public String testException(){
    System.out.println(1/0);
    return "success";
}      

在該控制器方法中抛出一個算術運算異常,運作

Spring MVC中的異常處理

2. 基于注解的全局異常處理

@ControllerAdvice:将目前類辨別為異常處理的元件,是Spring提供的新注解,它是對Controller的增強,可對 controller中被 @RequestMapping注解的方法加一些邏輯處理;

@ExceptionHandler:用于設定所辨別的方法處理的異常,@ExceptionHandler加在ControllerAdvice中,處理全局異常

​ExceptionController ​

@ControllerAdvice
public class ExceptionController {
    
    @ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})
    public String exception(Exception e, Model model){
        model.addAttribute("e",e);
        return "error";
    }
}      

@ExceptionHandler的value值可以是數組,是以可以添加許多可能出現的異常;在該方法中

當出現算數運算異常或空指針異常就會跳轉到我們自己設定的異常頁面,并且展示異常資訊。

​error.jsp​

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>錯誤頁面</title>
</head>
<body>
<h1>error</h1>
    ${e}
</body>
</html>      

​異常頁面​