示例 @ExceptionHandler处理异常
新建一个项目ExceptionHandlerTest
,加入所需的jar
文件,示例代码如下:
index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>异常处理示例</title> </head> <body> <a href="test">@ExceptionHandler处理异常</a> <br> <a href="login">UserController:使用从父类继承来的异常处理方法</a> <br> <a href="find">BookController:使用从父类继承来的异常处理方法</a> <br> </body> </html>
|
index.jsp
中有3个超链接,分别用于测试@ExceptionHandler
异常处理和使用父级Controller
异常处理。
TestController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package org.fkit.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView;
@Controller public class TestController { @GetMapping("/test") public String test() throws Exception { @SuppressWarnings("unused") int i = 5 / 0; return "success"; } @ExceptionHandler(value = Exception.class) public ModelAndView testErrorHandler(Exception e) { ModelAndView mav = new ModelAndView(); mav.setViewName("error"); mav.addObject("ex", e); return mav; } }
|
TestController
中test()
方法是index.jsp
页面的超链接"@ExceptionHandler处理异常
“的请求处理方法,模拟了一个除数不能为0的异常。
testErrorHandler()
方法使用了@ExceptionHandler
注解, value = Exception.class
表示处理所有的Exception
类型异常。当TestController
类抛出异常的时候,会使用@ExceptionHandler
注解的方法去处理异常,而不会直接抛给浏览器。 testErrorHandler()
方法将捕捉到的异常对象保存到ModelAndView
当中,传递到JSP
页面。
error.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试@ExceptionHandler注解</title> </head> <body> <h3>异常处理页面</h3> 抛出异常信息:${requestScope.ex.message} </body> </html>
|
部署ExceptionHandlerTest
这个Web
应用,在浏览器中输入如下URL
来测试应用:
1
| http://localhost:8080/ExceptionHandlerTest/
|
单击"@ExceptionHandler处理异常
“超链接,发送"test"
请求,TestController
的test()
方方法在处理请求抛出异常,异常会被同一类中的@ExceptionHandler
注解修饰的testErrorHandler
方法捕获,处理之后跳转到error.jsp
页面。
更好一点的做法
基于Controller
的@ExceptionHandler
注解方法在进行异常处理时,对于每个Controller
都需要写@ExceptionHandler
注解的异常处理方法,在实际开发当中这非常烦琐。可以写一个父类,在父类中完成@ExceptionHandler
注解的异常处理方法,所有的Controller
继承这个父类,则所有的Controller
就都拥有了@ExceptionHandler
注解的异常处理方法。
BaseExceptionController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package org.fkit.controller;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; public class BaseExceptionController { @ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(Exception e) throws Exception { ModelAndView mav = new ModelAndView(); mav.addObject("ex", e); mav.setViewName("error"); return mav; } }
|
BaseController
作为父类,定义了一个@ExceptionHandler
注解修饰的方法。
UserController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package org.fkit.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping;
@Controller public class UserController extends BaseExceptionController { @GetMapping("/login") public String login(String username) throws Exception { if (username == null) { throw new NullPointerException("用户名不存在!"); } return "success"; } }
|
UserController
继承BaseController
,如果抛出异常,将使用父类的ExceptionHandler
注解修饰的方法处理异常。
BookController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package org.fkit.controller;
import java.sql.SQLException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class BookController extends BaseExceptionController { @GetMapping("/find") public String find() throws Exception { try { @SuppressWarnings("unused") int i = 5 / 0; return "success"; } catch (Exception e) { throw new SQLException("查找图书信息失败!"); } } }
|
BookController
继承BaseController
,如果抛出异常,将使用父类的@ExceptionHandler
注解修饰的方法处理异常.
再次部署Exception2Test
这个Web
应用,在浏览器中输入如下URL
来测试应用,单击"UserController:父级Controller异常处理
“超链接,发送login
请求,异常处理之后跳转到error.jsp
页面.浏览器显示内容如下:
再次请求index.jsp
页面,单击BookController:使用从父类继承来的异常处理方法
超链接,发送"find"
请求,异常处理之后跳转到error.jsp
页面.此时浏览器显示内容如下:
原文链接: 示例 @ExceptionHandler处理异常