柏竹 柏竹
首页
后端
前端
  • 应用推荐
关于
友链
  • 分类
  • 标签
  • 归档

柏竹

奋斗柏竹
首页
后端
前端
  • 应用推荐
关于
友链
  • 分类
  • 标签
  • 归档
  • Java基础

  • JavaWeb

  • 拓展技术

  • 框架技术

  • 数据库

  • 数据结构

  • Spring

  • SpringMVC

    • SpringMVC
    • SpringMVC 静态资源的访问
    • SpringMVC 请求接收
    • SpringMVC 重定向和转发
    • SpringMVC 异常
      • Java实现
      • 注解实现
    • SpringMVC 拦截器
    • SpringMVC 上传&下载
    • SpringMVC RESTful API
  • SpringBoot

  • SpringClound

  • Ruoyi-Vue-Plus

  • 后端
  • SpringMVC
柏竹
2021-07-15
目录

SpringMVC 异常

# SpringMVC 异常

在该框架 开发过程中,难免都会有些可预知的异常,和不可预知的异常,但可以捕捉到它们,在捕捉这一过程,异常处理保证在出现问题的前提也不会终止程序!!

SpringMVC 自定义异常实现方式有两种:

  • Java程序搭配Spring实现
  • 注解实现

# Java实现

实现步骤:

  1. 创建 自定义异常类 ,并实现 HandlerExceptionResolver接口重写 resolveException()方法
  2. 在 resolveException()方法 当中 可以当做一个请求进行处理,响应形式为 ModelAndView
  3. 在 spring loc容器 配置中 添加 bean对象 即可

# 注解实现

通过 ==@ControllerAdvice/@ExceptionHandler== 实现

实现步骤:

  1. 创建 自定义异常类,在类中添加注解 @ControllerAdvice (控制器增强)
  2. 在方法当中添加指定 类型的异常注解 @ExceptionHandler({异常类,...})
  3. 在 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异常:(控制器中制造异常)

#SpringMVC#Java
上次更新: 2023/03/12, 00:43:49

← SpringMVC 重定向和转发 SpringMVC 拦截器→

最近更新
01
HTTPS自动续签
10-21
02
博客搭建-简化版(脚本)
10-20
03
ruoyi-vue-plus-部署篇
07-13
更多文章>
Theme by Vdoing | Copyright © 2019-2024 | 桂ICP备2022009417号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式