SpringMVC 异常
# SpringMVC 异常
在该框架 开发过程中,难免都会有些可预知的异常,和不可预知的异常,但可以捕捉到它们,在捕捉这一过程,异常处理保证在出现问题的前提也不会终止程序!!
SpringMVC 自定义异常实现方式有两种:
- Java程序搭配Spring实现
- 注解实现
# Java实现
实现步骤:
- 创建 自定义异常类 ,并实现
HandlerExceptionResolver
接口重写 resolveException()方法 - 在 resolveException()方法 当中 可以当做一个请求进行处理,响应形式为
ModelAndView
- 在 spring loc容器 配置中 添加 bean对象 即可
# 注解实现
通过 ==@ControllerAdvice/@ExceptionHandler== 实现
实现步骤:
- 创建 自定义异常类,在类中添加注解
@ControllerAdvice
(控制器增强) - 在方法当中添加指定 类型的异常注解
@ExceptionHandler({异常类,...})
- 在 spring loc容器 需要进行包扫描,否则无法创建对象
实例实现:(项目结构)
.
|
├── com
│ ├── controller
| | └── ExController
│ ├── exceptions
| | ├── GlobalExceptionHandler
| | ├── UserException
| | ├── UserIdException
| | └── UserNameException
| User
|
└── webapp
└── jsp
├── error.jsp
├── idError.jsp
├── nameError.jsp
└── ok.jsp
创建自定义异常
UserException
类 自定义异常
package com.exceptions;
/**
* 自定义异常
*/
public class UserException extends Exception{
public UserException() {
}
public UserException(String message) {
super(message);
}
}
UserIdException
类 自定义异常
package com.exceptions;
public class UserIdException extends UserException{
public UserIdException() {
}
public UserIdException(String message) {
super(message);
}
}
UserNameException
类 自定义异常
package com.exceptions;
public class UserNameException extends UserException {
public UserNameException() {
}
public UserNameException(String message) {
super(message);
}
}
ExController
类 异常处理器
package com.controller;
import com.exceptions.UserException;
import com.exceptions.UserIdException;
import com.exceptions.UserNameException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/ex")
public class ExController extends UserException {
@RequestMapping("exReceive/{id}/{name}")
public ModelAndView test01(
@PathVariable("id") int user_id,
@PathVariable("name") String user_name) throws UserIdException, UserNameException {
ModelAndView mv = new ModelAndView();
if (user_id<1000){
throw new UserIdException("id不合法,id不能少于1000");
}
if ("test".equals(user_name)){
throw new UserNameException("name不合法,不能使用“test”");
}
//System.out.println(10/0);
//正常返回 ok
mv.setViewName("jsp/ok");
return mv;
}
// 异常处理 异常处理方法1
///**
// * 异常处理 (异常处理方法1)
// * 注解参数:添加指定 异常类
// * @param ex 产生异常的对象
// * @return 指定响应结果
// */
//@ExceptionHandler(value = {UserIdException.class, UserNameException.class, Exception.class})
//public ModelAndView exHandler(Exception ex) {
// ModelAndView mv = new ModelAndView();
// //添加异常信息(响应给前台的)
// mv.addObject("exceptionMsg",ex.getMessage());
//
// //判断 异常对象 是否为 该对象的父类(实现类)
// if (ex instanceof UserIdException){
// mv.setViewName("jsp/idError");
// }else{
// if (ex instanceof UserNameException) {
// mv.setViewName("jsp/nameError");
// }else{
// mv.setViewName("jsp/error");
// }
// }
// return mv;
//}
//
}
GlobalExceptionHandler
类 全局异常处理类 (异常处理方法2)
一般将异常处理方法专门定义在一个类中,作为全局的异常处理类
- 使用注解@ControllerAdvice,就是“控制器增强”,是给控制器对象增强功能的。使用 @ControllerAdvice 修饰的类中可以使用@ExceptionHandler
- 当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常 处理方法
- @ControllerAdvice 注解所在的类需要进行包扫描,否则无法创建对象
<context:component-scan base-package="com.exceptions"/>
package com.exceptions;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义 全局异常处理类
* 在触发对应类的异常为前提 参会触发异常处理!!!
* @author Sans
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler (UserIdException.class)
public ModelAndView exceptionUserId(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("msg",ex.getMessage());
mv.setViewName("jsp/idError");
return mv;
}
@ExceptionHandler (UserNameException.class)
public ModelAndView exceptionUserUserName(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("msg",ex.getMessage());
mv.setViewName("jsp/nameError");
return mv;
}
@ExceptionHandler (Exception.class)
public ModelAndView exception(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("msg",ex.getMessage());
mv.setViewName("jsp/error");
return mv;
}
}
JSP页面
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>error------${exceptionMsg}</h1>
</body>
</html>
idError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>id error</title>
</head>
<body>
<h1>id error------${exceptionMsg}</h1>
</body>
</html>
nameError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>name Error</title>
</head>
<body>
<h1>name Error------${exceptionMsg}</h1>
</body>
</html>
ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>OK============</h1>
</body>
</html>
异常测试:
id异常:http://localhost:8088/ex/exReceive/100/Sanscan12
name异常:http://localhost:8088/ex/exReceive/1002/test
Error异常:(控制器中制造异常)
上次更新: 2023/03/12, 00:43:49