SpringMVC框架 - 异常处理

目录

异常处理

什么叫异常处理?

异常处理 :是指程序在运行过程中出现错误或异常情况时,通过特定机制来捕获、处理和恢复的过程。

异常处理机制

  1. 捕获异常:try - catch - finally
  2. 声明异常:throws
  3. 抛出异常:throw
  4. 自定义异常

为什么要进行异常处理?

为了增强程序的健壮性和可用性。

  1. 防止程序崩溃;
  2. 将错误处理代码与核心业务逻辑分离;
  3. 提供错误信息和定位问题;
  4. 确保资源被正确释放

如果不进行异常处理,会造成什么问题?

  1. 程序崩溃
  2. 资源泄露
  3. 数据不一致
  4. 安全问题

异常处理的场景

  1. I/O操作
  2. 网络通信
  3. 数据库操作
  4. 参数验证

SpringMVC框架 - 异常处理

异常处理思路

Controller层调用Service层,Service层调用Dao层,异常都是向上抛出,最终由DispatcherServlet(前端控制器)找异常处理器进行异常的处理。

使用try - catch处理异常

java 复制代码
package com.qcby.demo3;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/role")
@Controller
public class RoleController {
    /**
     * 自己处理异常
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findAll(){
        try {
            System.out.println("执行了......");
            // 模拟异常
            int a = 10/0;
        }catch (Exception e){
            e.printStackTrace();
        }
        return "suc";
    }
}

自定义异常处理

  1. Controller代码

    java 复制代码
    package com.qcby.demo3;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @RequestMapping("/role")
    @Controller
    public class RoleController {
        /**
         * 使用异常处理器方式
         * @return
         */
        @RequestMapping("/findAll.do")
        public String findAll(){
            System.out.println("执行了......");
            // 模拟异常
            int a = 10/0;
            return "suc";
        }
    }
  2. 自定义异常类

    java 复制代码
    package com.qcby.demo3;
    
    // 普通类继承异常类,
    public class SysException extends Exception {
        private String message;
    
        @Override
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public SysException(String message) {
            this.message = message;
        }
    }
  3. 自定义异常处理器

    java 复制代码
    package com.qcby.demo3;
    
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 异常处理器
     */
    public class SysExceptionResolver implements HandlerExceptionResolver {
        /**
         * 程序出现异常,调用异常处理器中的方法
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @param e
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            // 在控制台打印异常信息
            e.printStackTrace();
            // 做强转
            SysException exception = null;
            // 判断
            // instanceof父子类之间的强转,判断是否为某个类的真身
            if(e instanceof  SysException){
                exception = (SysException)e;
            }else {
                exception = new SysException("系统正在维护,请联系管理员");
            }
            // 存入异常提示信息
            ModelAndView mv = new ModelAndView();
            mv.addObject("errorMsg",e.getMessage());
            // 设置跳转的页面
            mv.setViewName("error");
            return mv;
        }
    }
  4. 在springmvc.xml中配置异常处理器

    xml 复制代码
    <!--配置异常处理器-->
    <bean id="sysExceptionResolver" class="com.qcby.demo3.SysExceptionResolver"></bean>
  5. jsp页面

    jsp 复制代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>错误提示页面</title>
    </head>
    <body>
        <h3>错误的友好提示页面</h3>
        <a href="/role/findAll.do">异常处理器</a>
        ${errorMsg}
    </body>
    </html>
相关推荐
只会写代码1 小时前
JDK8 Lambda 加持:打造优雅通用的对象构建器
java
songroom1 小时前
Rust: 量化策略回测与简易线程池构建(MPMC)
开发语言·后端·rust
摇滚侠1 小时前
Vue 项目实战《尚医通》,完成确定挂号业务,笔记46
java·开发语言·javascript·vue.js·笔记
正在走向自律2 小时前
豆包编程模型Doubao-Seed-Code深度体验,从零开始构建全栈项目的完整指南
java·服务器·数据库·doubao·claude code·火山方舟
钱多多_qdd2 小时前
基础篇:IoC(九):应用上下文ApplicationContext
java·spring
十五年专注C++开发2 小时前
libdatrie: 一个高效的 基于双数组字典树(Double-Array Trie)的C语言函数库
c语言·开发语言·trie
q***55892 小时前
SpringSecurity 实现token 认证
java
合作小小程序员小小店2 小时前
web网页开发,在线%医院诊断管理%系统,基于Idea,html,css,jQuery,java,jsp,ssh,mysql。
java·前端·css·数据库·jdk·html·intellij-idea
程序猿_极客2 小时前
【2025最新】 Java入门到实战:包装类、字符串转换、equals/toString + 可变字符串,一篇搞定开发高频场景(含案例解析)
java·开发语言·java进阶·面试核心·java快速入门