目錄
一、單個控制器異常處理
1.1 控制器方法
1.2 編寫出錯頁面
1.3 測試結果
二、全局異常處理
2.1 一個有異常的控制器類
2.2 全局異常處理器類
2.3 測試結果?
三、自定義異常處理器
3.1 自定義異常處理器
3.2 測試結果
往期專欄&文章相關導讀?
1. Maven系列專欄文章
2. Mybatis系列專欄文章
3. Spring系列專欄文章
4. Spring MVC系列專欄文章???
一、單個控制器異常處理
在系統(tǒng)當中, Dao、Service、Controller層代碼出現(xiàn)都可能拋出異常。如果哪里產生異常就在哪里處理,則會降低開發(fā)效率。所以一般情況下我們會讓異常向上拋出,最終到達DispatcherServlet中,此時SpringMVC提供了異常處理器進行異常處理,這樣可以提高開發(fā)效率
處理單個Controller的異常:
1.1 控制器方法
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MyController {
// 處理單個Controller異常
@RequestMapping("/t1")
public String t1(){
String str = null;
// str.length();
// int flag = 1/0;
int []arr = new int[1];
arr[2] = 10;
return "index";
}
/**
* 異常處理方法
* @param ex 異常對象
* @param model 模型對象
* @return
*/
// 添加@ExceptionHandler,表示該方法是處理異常的方法,屬性為處理的異常類
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandler1(Exception ex, Model model){
// 向模型中添加異常對象
model.addAttribute("msg",ex);
// 跳轉到異常頁面
return "error";
}
// 方法一不能處理的異常交給方法二處理
@ExceptionHandler({java.lang.Exception.class})
public String exceptionHandler2(Exception ex,Model model){
model.addAttribute("msg",ex);
return "error2";
}
}
從控制器方法我們可以知道,如果出現(xiàn)算術錯誤類的話則返回錯誤頁面1,否則都返回給錯誤頁面2.。并且把錯誤信息傳到前端。
1.2 編寫出錯頁面
這里編寫兩個錯誤頁面,為了是測試控制器是否成功知道出現(xiàn)的是哪一個錯誤。
錯誤頁面1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>出錯了!</title>
</head>
<body>
<h3>ERROR 發(fā)生異常! ${msg}</h3>
</body>
</html>
嚴重錯誤頁面2
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>出錯了!</title>
</head>
<body>
<h3>ERROR2 發(fā)生嚴重異常! ${msg}</h3>
</body>
</html>
1.3 測試結果
OK,這里測試運行一下,上面的應該返回的是錯誤頁面2,因為出現(xiàn)的錯誤是數組越界訪問。
OK,我們再換一個錯誤,注釋掉以下幾行,再重新運行一遍是否跳到錯誤頁面1,因為這里出現(xiàn)的算術錯誤。
OK,可以看到這里確實返回錯誤頁面1出來了
二、全局異常處理
在控制器中定義異常處理方法只能處理該控制器類的異常,要想處理所有控制器的異常,需要定義全局異常處理類。如何體現(xiàn)這個全局異常處理呢,我們需要新建一個異常類,一個全局異常處理類,錯誤頁面就按照上面兩個即可。
2.1 一個有異常的控制器類
這里就用一個數組越界的錯誤類。
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 編寫另一個有異常的控制器類
@Controller
public class MyController2 {
@RequestMapping("/t2")
public String t1(){
String str = null;
// str.length();
// int flag = 1/0;
int []arr = new int[1];
arr[2] = 10;
return "index";
}
}
2.2 全局異常處理器類
從控制器方法我們可以知道,如果出現(xiàn)算術錯誤類的話則返回錯誤頁面1,否則都返回給錯誤頁面2.。并且把錯誤信息傳到前端。
package com.example.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
// 全局異常處理類:添加@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 異常處理方法
* @param ex 異常對象
* @param model 模型對象
* @return
*/
// 添加@ExceptionHandler,表示該方法是處理異常的方法,屬性為處理的異常類
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandler1(Exception ex, Model model){
// 向模型中添加異常對象
model.addAttribute("msg",ex);
// 跳轉到異常頁面
return "error";
}
// 方法一不能處理的異常交給方法二處理
@ExceptionHandler({java.lang.Exception.class})
public String exceptionHandler2(Exception ex,Model model){
model.addAttribute("msg",ex);
return "error2";
}
}
2.3 測試結果?
OK,訪問路徑:http://localhost:8080/t2
OK,確實和我們預料的一樣,全局異常處理類發(fā)揮了作用。
三、自定義異常處理器
以上方式都是使用的SpringMVC自帶的異常處理器進行異常處理,我們還可以自定義異常處理器處理異常:
3.1 自定義異常處理器
package com.example.controller;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 自定義異常處理器實現(xiàn)HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof NullPointerException){
modelAndView.setViewName("error");
}
else {
modelAndView.setViewName("error2");
System.out.println("我自己的異常處理器");
}
modelAndView.addObject("msg",e);
return modelAndView;
}
}
3.2 測試結果
OK,為了體現(xiàn)自定義的異常處理器,我把全局異常處理器刪除再重新啟動服務器,訪問上面那個有異常控制類。可以看到自定義異常處理類發(fā)揮了作用。
往期專欄&文章相關導讀?
?????大家如果對于本期內容有什么不了解的話也可以去看看往期的內容,下面列出了博主往期精心制作的Maven,Mybatis等專欄系列文章,走過路過不要錯過哎!如果對您有所幫助的話就點點贊,收藏一下啪。其中Spring專欄有些正在更,所以無法查看,但是當博主全部更完之后就可以看啦。文章來源:http://www.zghlxwxcb.cn/news/detail-572328.html
1. Maven系列專欄文章
Maven系列專欄 | Maven工程開發(fā) |
Maven聚合開發(fā)【實例詳解---5555字】 |
2. Mybatis系列專欄文章
Mybatis系列專欄 | MyBatis入門配置 |
Mybatis入門案例【超詳細】 | |
MyBatis配置文件 —— 相關標簽詳解 | |
Mybatis模糊查詢——三種定義參數方法和聚合查詢、主鍵回填 | |
Mybatis動態(tài)SQL查詢 --(附實戰(zhàn)案例--8888個字--88質量分) | |
Mybatis分頁查詢——四種傳參方式 | |
Mybatis一級緩存和二級緩存(帶測試方法) | |
Mybatis分解式查詢 | |
Mybatis關聯(lián)查詢【附實戰(zhàn)案例】 | |
MyBatis注解開發(fā)---實現(xiàn)增刪查改和動態(tài)SQL | |
MyBatis注解開發(fā)---實現(xiàn)自定義映射關系和關聯(lián)查詢 |
3. Spring系列專欄文章
Spring系列專欄 | Spring IOC 入門簡介【自定義容器實例】 |
IOC使用Spring實現(xiàn)附實例詳解 | |
Spring IOC之對象的創(chuàng)建方式、策略及銷毀時機和生命周期且獲取方式 | |
Spring DI簡介及依賴注入方式和依賴注入類型 | |
Spring IOC相關注解運用——上篇 | |
Spring IOC相關注解運用——下篇 | |
Spring AOP簡介及相關案例 | |
注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP【附詳細案例】 | |
Spring事務簡介及相關案例 | |
Spring 事務管理方案和事務管理器及事務控制的API | |
Spring 事務的相關配置、傳播行為、隔離級別及注解配置聲明式事務 |
4. Spring MVC系列專欄文章???
SpringMVC系列專欄 | Spring MVC簡介附入門案例 |
Spring MVC各種參數獲取及獲取方式自定義類型轉換器和編碼過濾器 | |
Spring MVC獲取參數和自定義參數類型轉換器及編碼過濾器 | |
Spring MVC處理響應附案例詳解 | |
Spring MVC相關注解運用 —— 上篇 | |
Spring MVC相關注解運用 —— 中篇文章來源地址http://www.zghlxwxcb.cn/news/detail-572328.html | |
Spring MVC相關注解運用 —— 下篇 | |
Spring MVC多種情況下的文件上傳 | |
Spring MVC異步上傳、跨服務器上傳和文件下載 | |
Spring MVC異常處理【單個控制異常處理器、全局異常處理器、自定義異常處理器】 | |
Spring MVC攔截器和跨域請求 | |
SSM整合案例【C站講解最詳細流程的案例】 |
到了這里,關于Spring MVC異常處理【單個控制異常處理器、全局異常處理器、自定義異常處理器】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!