1. 程式人生 > 其它 >springboot 處理大量請求_SpringBoot異常處理的五種方式

springboot 處理大量請求_SpringBoot異常處理的五種方式

技術標籤:springboot 處理大量請求

1.自定義錯誤頁面

SpringBoot 預設的處理異常的機制:SpringBoot 預設的已經提供了一套處理異常的機制。 一旦程式中出現了異常 SpringBoot 會像/error 的 url 傳送請求。在 springBoot 中提供了一個 叫 BasicExceptionController 來處理/error 請求,然後跳轉到預設顯示異常的頁面來展示異常資訊。

預設錯誤頁面:

6cbdbf0a485dbe8953b9b0437bb699ad.png

1.1如 果 我 們 需 要 將 所 有 的 異 常 同 一 跳 轉 到 自 定 義 的 錯 誤 頁 面 , 需 要 再 src/main/resources/templates 目錄下建立 error.html 頁面。

注意:名稱必須叫 error

error.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <!--SpringBoot預設儲存異常資訊的key為exception-->
	<span th:text="${exception}" />
</body>
</html>

[email protected] 註解處理異常

@Controller
public class DemoController {
	@RequestMapping("/show")
	public String showInfo() {
		String str = null;
		str.length();
		return "index";
	}

	@RequestMapping("/show2")
	public String showInfo2() {
		int a = 10 / 0;
		return "index";
	}

	/**
	 * java.lang.ArithmeticException 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常資訊以及視
	 * 圖的指定 引數 Exception e:會將產生異常物件注入到方法中
	 */
	@ExceptionHandler(value = { java.lang.ArithmeticException.class })
	public ModelAndView arithmeticExceptionHandler(Exception e) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.setViewName("error1");
		return mv;
	}

	/**
	 * java.lang.NullPointerException 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常資訊以及視
	 * 圖的指定 引數 Exception e:會將產生異常物件注入到方法中
	 */
	@ExceptionHandler(value = { java.lang.NullPointerException.class })
	public ModelAndView nullPointerExceptionHandler(Exception e) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.setViewName("error2");
		return mv;
	}
}

優點:可以自定義異常資訊儲存的key,自定義跳轉檢視的名稱

缺點:需要編寫大量的異常處理方法,不能跨controller,如果兩個controller中出現同樣的異常,需要重新編寫異常處理的方法

[email protected][email protected] 註解處理異常

/* 全域性異常處理類
*
*
*/
@ControllerAdvice
public class GlobalException {
	/**
	 * java.lang.ArithmeticException 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常資訊以及視
	 * 圖的指定 引數 Exception e:會將產生異常物件注入到方法中
	 */
	@ExceptionHandler(value = { java.lang.ArithmeticException.class })
	public ModelAndView arithmeticExceptionHandler(Exception e) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.setViewName("error1");
		return mv;
	}

	/**
	 * java.lang.NullPointerException 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常資訊以及視
	 * 圖的指定 引數 Exception e:會將產生異常物件注入到方法中
	 */
	@ExceptionHandler(value = { java.lang.NullPointerException.class })
	public ModelAndView nullPointerExceptionHandler(Exception e) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.setViewName("error2");
		return mv;
	}
}

缺點:編寫大量的異常處理方法,程式碼冗餘

4.配置 SimpleMappingExceptionResolver 處理異常

/**
 * 通過 SimpleMappingExceptionResolver 做全域性異常處理
 *
 *
 */
@Configuration//表名該類是一個配置類
public class GlobalException {
	/**
	 * 該方法必須要有返回值。返回值型別必須是: SimpleMappingExceptionResolver
	 */
	@Bean//完成bean的註冊
	public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
		SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
		Properties mappings = new Properties();
		/**
		 * 引數一:異常的型別,注意必須是異常型別的全名 引數二:檢視名稱
		 */
		mappings.put("java.lang.ArithmeticException", "error1");
		mappings.put("java.lang.NullPointerException", "error2");
		// 設定異常與檢視對映資訊的
		resolver.setExceptionMappings(mappings);
		return resolver;
	}
}

缺點:不顯示具體異常資訊

5.自定義 HandlerExceptionResolver 類處理異常

/**
 * 通過實現 HandlerExceptionResolver 介面做全域性異常處理
 *
 *
 */
@Configuration
public class GlobalException implements HandlerExceptionResolver {
	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		ModelAndView mv = new ModelAndView();
		// 判斷不同異常型別,做不同檢視跳轉
		if (ex instanceof ArithmeticException) {
			mv.setViewName("error1");
		}
		if (ex instanceof NullPointerException) {
			mv.setViewName("error2");
		}
		mv.addObject("error", ex.toString());
		return mv;
	}
}