《怪物獵人崛起》軟妹風格捏臉資料
SpringBoot 框架異常處理有五種處理方式,從範圍來說包括有全域性異常捕獲處理方式和區域性異常捕獲處理方式,接下來通過使用下面的後端程式碼一一對這五種捕獲方式講解。
package com.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Description 丟擲異常 Controller,測試異常
* @author 歐陽
* @since 2019年4月12日 下午12:48:31
* @version V1.0
*/
@Controller
public class ExceptionController {
private static final Logger log = LoggerFactory.getLogger(ExceptionController.class);
@RequestMapping("/exceptionMethod")
public String exceptionMethod(Model model) throws Exception {
model.addAttribute("msg", "沒有丟擲異常");
int num = 1/0; //a處
log.info(String.valueOf(num));
return "home";
}
}
上述程式碼將會在 a處丟擲ArithmeticException
異常。
一、自定義異常錯誤頁面
相信大家有過這樣的經歷,在遇到異常時,SpringBoot 會自動跳到一個統一的異常頁面,沒錯,SpringBoot 預設的已經提供了一套處理異常的機制,我們只需要自定義該錯誤頁面就可以,所以這種方式就是自定義這個異常的錯誤頁面。
SpringBoot 預設的異常處理機制:一旦程式中出現了異常 SpringBoot 就會請求/error
的 url 。在 SpringBoot 中提供了一個叫 BasicExceptionController 來處理/error
請求,然後跳轉到預設顯示異常的頁面來展示異常資訊。接下來就是自定義異常錯誤頁面了,方法很簡單,就是在目錄src/main/resources/templates/
error
的檔案,可以是 jsp 也可以是 html 。上圖為在指定目錄
src/main/resources/templates/
新增error.html
頁面前效果。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定義 springboot 異常處理頁面</title>
</head>
<body>
Springboot BasicExceptionController 錯誤頁面
<br>
<span th:text="${msg}"></span>
</body>
</html>
在指定目錄新增 error.html 頁面後效果圖:
注意:必須是在目錄src/main/resources/templates/
下定義error
的檔案。
二、使用@ExceptionHandler
註解處理區域性異常
使用這個註解就容易了,但是隻能處理使用@ExceptionHandler
註解的方法的Controller
的異常,對於其他Controller
的異常就無能為力了,只能再使用同樣的方法將使用@ExceptionHandler
註解的方法寫入要捕獲異常的Controller
中,所以不推薦使用。
使用方式:在最上面的ExceptionController
中加入使用@ExceptionHandler
註解的方法程式碼,整個ExceptionController
程式碼如下:
package com.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Description 丟擲異常 Controller,測試異常
* @author 歐陽
* @since 2019年4月12日 下午12:48:31
* @version V1.0
*/
@Controller
public class ExceptionController {
private static final Logger log = LoggerFactory.getLogger(ExceptionController.class);
@RequestMapping("/exceptionMethod")
public String exceptionMethod(Model model) throws Exception {
model.addAttribute("msg", "沒有丟擲異常");
int num = 1/0;
log.info(String.valueOf(num));
return "home";
}
/**
* 描述:捕獲 ExceptionController 中的 ArithmeticException 異常
* @param model 將Model物件注入到方法中
* @param e 將產生異常物件注入到方法中
* @return 指定錯誤頁面
*/
@ExceptionHandler(value = {ArithmeticException.class})
public String arithmeticExceptionHandle(Model model, Exception e) {
model.addAttribute("msg", "@ExceptionHandler" + e.getMessage());
log.info(e.getMessage());
return "error";
}
}
程式碼說明:註解@ExceptionHandler
中value
的值為陣列,表示指定捕獲的異常型別,這裡表示捕獲ArithmeticException
異常,因為a 處
丟擲的是ArithmeticException
異常,跳轉的頁面為統一的error.html
頁面,但描述資訊不同,以用來區分是 SpringBoot 處理的異常還是我們自己的方法處理的異常,下面也是使用這個方式來區分。
當訪問http://localhost:8080/exceptionMethod
時,跳轉到下面頁面,顯示@ExceptionHandler/ by zero
,表示我們使用@ExceptionHandler
註解處理異常成功。
三、使用@ControllerAdvice
+@ExceptionHandler
註解處理全域性異常
使用@ControllerAdvice
+@ExceptionHandler
註解能夠處理全域性異常,這種方式推薦使用,可以根據不同的異常對不同的異常進行處理。
使用方式:定義一個類,使用@ControllerAdvice
註解該類,使用@ExceptionHandler
註解方法,這裡我定義了一個GlobalException
類表示來處理全域性異常,程式碼如下:
package com.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @Description 全域性異常處理類
* @author 歐陽
* @since 2019年4月12日 下午3:52:04
* @version V1.0
*/
@ControllerAdvice
public class GlobalException {
private static final Logger log = LoggerFactory.getLogger(GlobalException.class);
/**
* 描述:捕獲 ArithmeticException 異常
* @param model 將Model物件注入到方法中
* @param e 將產生異常物件注入到方法中
* @return 指定錯誤頁面
*/
@ExceptionHandler(value = {ArithmeticException.class})
public String arithmeticExceptionHandle(Model model, Exception e) {
model.addAttribute("msg", "@ControllerAdvice + @ExceptionHandler :" + e.getMessage());
log.info(e.getMessage());
return "error";
}
}
如果需要處理其他異常,例如NullPointerException
異常,則只需要在GlobalException
類中定義一個方法使用@ExceptionHandler(value = {NullPointerException.class})
註解該方法,在該方法內部處理異常就可以了。
當訪問http://localhost:8080/exceptionMethod
時,跳轉到下面頁面,顯示@ControllerAdvice + @ExceptionHandler :/ by zero
,表示我們使用@ControllerAdvice
+@ExceptionHandler
註解處理異常成功。
四、配置SimpleMappingExceptionResolver
類處理異常
通過配置SimpleMappingExceptionResolver
類處理異常也是全域性範圍的,通過將SimpleMappingExceptionResolver
類注入到 Spring 容器。
package com.config;
import java.util.Properties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
/**
* @Description 配置 SimpleMappingExceptionResolver 類處理異常
* @author 歐陽
* @since 2019年4月12日 下午5:01:08
* @version V1.0
*/
@Configuration
public class GlobalException {
@Bean
public SimpleMappingExceptionResolver
getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/*
* 引數一:異常的型別,注意必須是異常型別的全名
* 引數二:檢視名稱
*/
mappings.put("java.lang.ArithmeticException", "errors");
//設定異常與檢視對映資訊的
resolver.setExceptionMappings(mappings);
return resolver;
}
}
注意:在類上加上@Configuration
註解,在方法上加上@Bean
註解,方法返回值必須是SimpleMappingExceptionResolver
。
編寫errors.html
頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定義 springboot 異常處理頁面</title>
</head>
<body>
配置 SimpleMappingExceptionResolver 類處理異常
</body>
</html>
訪問http://localhost:8080/exceptionMethod
連結後丟擲ArithmeticException
異常,跳轉到errors.html
頁面,效果圖如下所示:
五、實現HandlerExceptionResolver
介面處理異常
通過實現HandlerExceptionResolver
介面處理異常,第一步是編寫類實現HandlerExceptionResolver
介面。
package com.config;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
/**
* @Description 實現 HandlerExceptionResolver 介面處理異常
* @author 歐陽
* @since 2019年4月12日 下午5:13:58
* @version V1.0
*/
@Configuration
public class HandlerExceptionResolverImpl implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "實現 HandlerExceptionResolver 介面處理異常");
//判斷不同異常型別,做不同檢視跳轉
if(ex instanceof ArithmeticException){
modelAndView.setViewName("error");
}
return modelAndView;
}
}
注意:在類上加上@Configuration
註解。
配置完後訪問http://localhost:8080/exceptionMethod
後效果:
轉自:https://www.cnblogs.com/bzdan/p/13666063.html