公益網(wǎng)站建設(shè)需求/大數(shù)據(jù)分析師
目錄
一、單個(gè)控制器異常處理
1.1 控制器方法
1.2 編寫(xiě)出錯(cuò)頁(yè)面
1.3 測(cè)試結(jié)果
二、全局異常處理
2.1 一個(gè)有異常的控制器類(lèi)
2.2 全局異常處理器類(lèi)
2.3 測(cè)試結(jié)果?
三、自定義異常處理器
3.1 自定義異常處理器
3.2 測(cè)試結(jié)果
往期專(zhuān)欄&文章相關(guān)導(dǎo)讀?
1. Maven系列專(zhuān)欄文章
2. Mybatis系列專(zhuān)欄文章
3. Spring系列專(zhuān)欄文章
4. Spring MVC系列專(zhuān)欄文章???
一、單個(gè)控制器異常處理
在系統(tǒng)當(dāng)中, Dao、Service、Controller層代碼出現(xiàn)都可能拋出異常。如果哪里產(chǎn)生異常就在哪里處理,則會(huì)降低開(kāi)發(fā)效率。所以一般情況下我們會(huì)讓異常向上拋出,最終到達(dá)DispatcherServlet中,此時(shí)SpringMVC提供了異常處理器進(jìn)行異常處理,這樣可以提高開(kāi)發(fā)效率
處理單個(gè)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 {// 處理單個(gè)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 異常對(duì)象* @param model 模型對(duì)象* @return*/// 添加@ExceptionHandler,表示該方法是處理異常的方法,屬性為處理的異常類(lèi)@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandler1(Exception ex, Model model){// 向模型中添加異常對(duì)象model.addAttribute("msg",ex);// 跳轉(zhuǎn)到異常頁(yè)面return "error";}// 方法一不能處理的異常交給方法二處理@ExceptionHandler({java.lang.Exception.class})public String exceptionHandler2(Exception ex,Model model){model.addAttribute("msg",ex);return "error2";}
}
從控制器方法我們可以知道,如果出現(xiàn)算術(shù)錯(cuò)誤類(lèi)的話則返回錯(cuò)誤頁(yè)面1,否則都返回給錯(cuò)誤頁(yè)面2.。并且把錯(cuò)誤信息傳到前端。
1.2 編寫(xiě)出錯(cuò)頁(yè)面
這里編寫(xiě)兩個(gè)錯(cuò)誤頁(yè)面,為了是測(cè)試控制器是否成功知道出現(xiàn)的是哪一個(gè)錯(cuò)誤。
錯(cuò)誤頁(yè)面1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>出錯(cuò)了!</title>
</head>
<body>
<h3>ERROR 發(fā)生異常! ${msg}</h3>
</body>
</html>
嚴(yán)重錯(cuò)誤頁(yè)面2
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>出錯(cuò)了!</title>
</head>
<body>
<h3>ERROR2 發(fā)生嚴(yán)重異常! ${msg}</h3>
</body>
</html>
1.3 測(cè)試結(jié)果
OK,這里測(cè)試運(yùn)行一下,上面的應(yīng)該返回的是錯(cuò)誤頁(yè)面2,因?yàn)槌霈F(xiàn)的錯(cuò)誤是數(shù)組越界訪問(wèn)。
OK,我們?cè)贀Q一個(gè)錯(cuò)誤,注釋掉以下幾行,再重新運(yùn)行一遍是否跳到錯(cuò)誤頁(yè)面1,因?yàn)檫@里出現(xiàn)的算術(shù)錯(cuò)誤。
OK,可以看到這里確實(shí)返回錯(cuò)誤頁(yè)面1出來(lái)了
二、全局異常處理
在控制器中定義異常處理方法只能處理該控制器類(lèi)的異常,要想處理所有控制器的異常,需要定義全局異常處理類(lèi)。如何體現(xiàn)這個(gè)全局異常處理呢,我們需要新建一個(gè)異常類(lèi),一個(gè)全局異常處理類(lèi),錯(cuò)誤頁(yè)面就按照上面兩個(gè)即可。
2.1 一個(gè)有異常的控制器類(lèi)
這里就用一個(gè)數(shù)組越界的錯(cuò)誤類(lèi)。
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;// 編寫(xiě)另一個(gè)有異常的控制器類(lèi)
@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 全局異常處理器類(lèi)
從控制器方法我們可以知道,如果出現(xiàn)算術(shù)錯(cuò)誤類(lèi)的話則返回錯(cuò)誤頁(yè)面1,否則都返回給錯(cuò)誤頁(yè)面2.。并且把錯(cuò)誤信息傳到前端。
package com.example.controller;import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;// 全局異常處理類(lèi):添加@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {/*** 異常處理方法* @param ex 異常對(duì)象* @param model 模型對(duì)象* @return*/// 添加@ExceptionHandler,表示該方法是處理異常的方法,屬性為處理的異常類(lèi)@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandler1(Exception ex, Model model){// 向模型中添加異常對(duì)象model.addAttribute("msg",ex);// 跳轉(zhuǎn)到異常頁(yè)面return "error";}// 方法一不能處理的異常交給方法二處理@ExceptionHandler({java.lang.Exception.class})public String exceptionHandler2(Exception ex,Model model){model.addAttribute("msg",ex);return "error2";}
}
2.3 測(cè)試結(jié)果?
OK,訪問(wèn)路徑:http://localhost:8080/t2
OK,確實(shí)和我們預(yù)料的一樣,全局異常處理類(lèi)發(fā)揮了作用。
三、自定義異常處理器
以上方式都是使用的SpringMVC自帶的異常處理器進(jìn)行異常處理,我們還可以自定義異常處理器處理異常:
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;// 自定義異常處理器實(shí)現(xiàn)HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {@Overridepublic 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 測(cè)試結(jié)果
OK,為了體現(xiàn)自定義的異常處理器,我把全局異常處理器刪除再重新啟動(dòng)服務(wù)器,訪問(wèn)上面那個(gè)有異??刂祁?lèi)??梢钥吹阶远x異常處理類(lèi)發(fā)揮了作用。
往期專(zhuān)欄&文章相關(guān)導(dǎo)讀?
?????大家如果對(duì)于本期內(nèi)容有什么不了解的話也可以去看看往期的內(nèi)容,下面列出了博主往期精心制作的Maven,Mybatis等專(zhuān)欄系列文章,走過(guò)路過(guò)不要錯(cuò)過(guò)哎!如果對(duì)您有所幫助的話就點(diǎn)點(diǎn)贊,收藏一下啪。其中Spring專(zhuān)欄有些正在更,所以無(wú)法查看,但是當(dāng)博主全部更完之后就可以看啦。
1. Maven系列專(zhuān)欄文章
Maven系列專(zhuān)欄 | Maven工程開(kāi)發(fā) |
Maven聚合開(kāi)發(fā)【實(shí)例詳解---5555字】 |
2. Mybatis系列專(zhuān)欄文章
Mybatis系列專(zhuān)欄 | MyBatis入門(mén)配置 |
Mybatis入門(mén)案例【超詳細(xì)】 | |
MyBatis配置文件 —— 相關(guān)標(biāo)簽詳解 | |
Mybatis模糊查詢——三種定義參數(shù)方法和聚合查詢、主鍵回填 | |
Mybatis動(dòng)態(tài)SQL查詢 --(附實(shí)戰(zhàn)案例--8888個(gè)字--88質(zhì)量分) | |
Mybatis分頁(yè)查詢——四種傳參方式 | |
Mybatis一級(jí)緩存和二級(jí)緩存(帶測(cè)試方法) | |
Mybatis分解式查詢 | |
Mybatis關(guān)聯(lián)查詢【附實(shí)戰(zhàn)案例】 | |
MyBatis注解開(kāi)發(fā)---實(shí)現(xiàn)增刪查改和動(dòng)態(tài)SQL | |
MyBatis注解開(kāi)發(fā)---實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢 |
3. Spring系列專(zhuān)欄文章
Spring系列專(zhuān)欄 | Spring IOC 入門(mén)簡(jiǎn)介【自定義容器實(shí)例】 |
IOC使用Spring實(shí)現(xiàn)附實(shí)例詳解 | |
Spring IOC之對(duì)象的創(chuàng)建方式、策略及銷(xiāo)毀時(shí)機(jī)和生命周期且獲取方式 | |
Spring DI簡(jiǎn)介及依賴注入方式和依賴注入類(lèi)型 | |
Spring IOC相關(guān)注解運(yùn)用——上篇 | |
Spring IOC相關(guān)注解運(yùn)用——下篇 | |
Spring AOP簡(jiǎn)介及相關(guān)案例 | |
注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP【附詳細(xì)案例】 | |
Spring事務(wù)簡(jiǎn)介及相關(guān)案例 | |
Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API | |
Spring 事務(wù)的相關(guān)配置、傳播行為、隔離級(jí)別及注解配置聲明式事務(wù) |
4. Spring MVC系列專(zhuān)欄文章???
SpringMVC系列專(zhuān)欄 | Spring MVC簡(jiǎn)介附入門(mén)案例 |
Spring MVC各種參數(shù)獲取及獲取方式自定義類(lèi)型轉(zhuǎn)換器和編碼過(guò)濾器 | |
Spring MVC獲取參數(shù)和自定義參數(shù)類(lèi)型轉(zhuǎn)換器及編碼過(guò)濾器 | |
Spring MVC處理響應(yīng)附案例詳解 | |
Spring MVC相關(guān)注解運(yùn)用 —— 上篇 | |
Spring MVC相關(guān)注解運(yùn)用 —— 中篇 | |
Spring MVC相關(guān)注解運(yùn)用 —— 下篇 | |
Spring MVC多種情況下的文件上傳 | |
Spring MVC異步上傳、跨服務(wù)器上傳和文件下載 | |
Spring MVC異常處理【單個(gè)控制異常處理器、全局異常處理器、自定義異常處理器】 | |
Spring MVC攔截器和跨域請(qǐng)求 | |
SSM整合案例【C站講解最詳細(xì)流程的案例】 |