spring boot異常捕獲的四種方式

1.通過自定義錯誤頁面

spring boot默認的處理異常的機制:spring boot默認的提供了一套處理異常的機制,一旦出現程序異常spring
boot會向/error發起請求。在spring boot中提供了一個 叫Base exception
controller的類來處理/error的請求。然後跳轉到默認的異常顯示頁面來展示錯誤信息。

如果我們需要將所有的統一跳轉到自定義的錯誤頁面,需要在/src/main/resources/templates目錄下創建error.html頁面
例如:


	@RequestMapping("/show")
	public String showInfo() {
		System.out.println("come in");
		String str = null;
		str.length();
		return "index.html";
	}
	@RequestMapping("/show2")
	public String showInfo2() {
		System.out.println("come in");
		int a = 10/0;
		return "index.html";
	}

中途出了錯誤會會自動跳轉到error頁面。
2.@ExceptionHandler註解異常捕獲然後處理
參數***Exception會將產生的異常注入到產生的方法中,但是這個註解有個缺點就是隻能針對本類中的異常做處理,並不能對整個項目的異常做處理
例如:

@ExceptionHandler(value = {java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
	
	
	public ModelAndView NullPointerException(Exception e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error",e.toString());
		mv.addObject("status","500");
		mv.setViewName("error1");
		return mv;
	}
	@ExceptionHandler(value = {java.lang.NullPointerException.class})
	public ModelAndView NullPointerException(NullPointerException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error",e.toString());
		mv.addObject("status","500");
		mv.setViewName("error1");
		return mv;
	}

3.@ControllerAdvice+@ExceptionHandler結合使用
這種情況是一般項目中普遍使用的異常捕捉方法,這樣的話就可以對全局的異常進行捕獲,還能對異常進行處理,相對於以上甚至以下的方法都很好用

@ControllerAdvice
public class GlobalException {

	@ExceptionHandler(value = { java.lang.NullPointerException.class })
	public ModelAndView NullPointerException(NullPointerException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}

	@ExceptionHandler(value = {java.lang.ArithmeticException.class })

	public ModelAndView NullPointerException(ArithmeticException e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}

	/*@ExceptionHandler(value = { java.lang.NullPointerException.class, java.lang.ArithmeticException.class })

	public ModelAndView NullPointerException(Exception e) {
		System.out.println(e);
		ModelAndView mv = new ModelAndView();
		mv.addObject("error", e.toString());
		mv.addObject("status", "500");
		mv.setViewName("error1");
		return mv;
	}*/

4.HandlerExceptionResolver全局異常處理類
這種方法有一定的侷限性,但是使用起來也很方便,它只能返回ModelAndView對象
例如:


@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 NullPointerException) {
			mv.setViewName("error");
		}
		if(ex instanceof ArithmeticException) {
			mv.setViewName("error1");
		}
		mv.addObject("error",ex.toString());
		return mv;
	}
}

error,error1對應的是/src/main/resources/templates目錄下創建error.html頁面

簡化版的是:


	/*
	 * 該方法必須有返回值,返回值類型爲:SimpleMappingExceptionResolver
	 * 
	 * 有點是簡化了前面的方法,但是不能傳遞異常對象
	 */
	@Bean
	public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
		SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
		Properties mappings = new Properties();
		/*
		 * 
		 * 參數一:異常的類型,注意必須是異常類型的全名
		 * 
		 * 參數二:跳轉到視圖的視圖名稱
		 * 
		 * */
		mappings.put("java.lang.NullPointerException", "error");
		mappings.put("java.lang.ArithmeticException", "error1");
		resolver.setExceptionMappings(mappings);
		return resolver;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章