首页 > 其他分享 >SpringMVC学习系列(10) 之 异常处理

SpringMVC学习系列(10) 之 异常处理

时间:2023-05-29 13:01:12浏览次数:51  
标签:10 系列 BaseController SpringMVC 处理 捕捉 ModelAndView 异常 public


在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。

在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理:

一.继承HandlerExceptionResolver接口实现自己的处理方法,如:




public class MyHandlerExceptionResolver implements HandlerExceptionResolver {   
  
    @Override  
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {   

        //添加自己的异常处理逻辑,如日志记录等        

         // TODO Auto-generated method stub   
        return new ModelAndView("exception");   
    }   
  
}


然后在项目的配置文件中添加:



<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>



这样就完成了异常的捕捉和处理。

 

二.我们介绍了第一种捕捉处理异常方式,但是第一种方式需要在配置文件中进行配置,有的时候我们会觉得配置文件内容太多太乱,那么我们就可以借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。

首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController,内容如下:




package com.demo.web.controllers;

import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;

public abstract class BaseController {  

    @ExceptionHandler
    public String exception(HttpServletRequest request, Exception e) {  
          
      //添加自己的异常处理逻辑,如日志记录   
        request.setAttribute("exceptionMessage", e.getMessage());  
          
        // 根据不同的异常类型进行不同处理
        if(e instanceof SQLException) 
            return "testerror";   
        else
            return "error";  
    }  
    
}




 

其次,修改项目中HelloWorldController让它继承于BaseController以便进行测试:



public class HelloWorldController extends BaseController{
    //...内容省略
}



然后,修改HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:




//@AuthPassport
@RequestMapping(value={"/index","/hello"})
public ModelAndView index() throws SQLException{
    
    throw new SQLException("数据库异常。");
    
    /*ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject("message", "Hello World!");  
    modelAndView.setViewName("index");  
    return modelAndView;*/
}




最后,在views文件夹中添加testerror.jsp视图来显示错误信息:




<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error!</title>
</head>
<body>
    ${exceptionMessage}
</body>
</html>




运行项目:

SpringMVC学习系列(10) 之 异常处理_配置文件

可以看到异常已经被捕捉并显示,这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了。

 

标签:10,系列,BaseController,SpringMVC,处理,捕捉,ModelAndView,异常,public
From: https://blog.51cto.com/u_16131764/6370172

相关文章

  • [AGC010B]Boxes
    AGC010BBoxes先将题目转换成正着的,即由全\(0\)变为给定的序列。操作次数为\(k=\dfrac{\suma_i}{n(n+1)\div2}\)。条件\(k\)必定是整数很显然。这道题的重点在于这个增加的数列是一个等差数列,考虑到这样差分数组十分方便,对\(a\)原地差分,设以\(i\)为起点做一次操作,进......
  • Python工具箱系列(三十四)
    SQLAlchemy是著名的ORM(ObjectRelationalMapping-对象关系映射)框架。其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。对许多语言(例如JAVA/PYTHON)来说就是定义一个对象,并且这个对象对应着一张数据库的表。而这个对象的实例,就对应着表中的一条记录。其整体思......
  • 2022 AMC 10A Problems
    2022AMC10AProblemsProblem1Whatisthevalueof                                             Problem2Mikecycledlapsinminutes.Assumehecycledataconst......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建
    1.简介有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了。其实在各大博客和公众号也看到过其相关的介绍和讲解。要不就是不全面、不系统,要不就是系统全面但是人家是收费的。当然了宏哥接下来也可能介绍的不全面或者不系统,能力有限望......
  • 【华为HCIP | 高级网络工程师】刷题日记(10)
    个人名片:......
  • Flask010_自定义过滤器
    在模板中,通过过滤器实现对变量的处理。过滤器本质上是Python的函数,它会把被过滤器的值当作第1个参数传送给函数。自定义过滤器定义1defdatetime_format(value,format="%Y-%m-%d%H:%M"):2returnvalue.strftime(format)345app.add_template_filter(date......
  • Struct2系列漏洞POC整理
    Struct2-001%{#a=(newjava.lang.ProcessBuilder(newjava.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=newjava.io.InputStreamReader(#b),#d=newjava.io.BufferedReader(#c),#e=newchar[50000],#d.read(#e),#f=#co......
  • python3.10版本以后使用asyncio不报错方法
    importasyncioimporttimeasyncdeffunc1():print(1)awaitasyncio.sleep(2)print(2)asyncdeffunc2():print(3)awaitasyncio.sleep(2)print(4)asyncdefmain():task=[asyncio.ensure_future(func1()),asy......
  • 微软官方MediaCreationTool(win10、win11安装系统的工具)下载镜像慢问题的解决
    现在重装win10、win11系统,很多人使用微软官方的MediaCreationTool制作U盘镜像,该工具会帮助用户从微软官方下载镜像到U盘,但很多咱们国内地方的下载速度很慢。看了一些说法,最终怀疑到DNS上面来,实际改了一下,效果非常好,我家300Mbps的宽带,以前下这个得4-5个小时,改了DNS只需要不到5分钟......
  • Spider理论系列--MongoDB(二)
    NoSQLMongodb下载mongodb的版本,两点注意根据业界规则,偶数为稳定版,如1.6.X,奇数为开发版,如1.7.X32bit的mongodb最大只能存放2G的数据,64bit就没有限制性能BSON格式的编码和解码都是非常快速的。它使用了C风格的数据表现形式,这样在各种语言中都可以高效地使用。NoSQL(NoSQL=NotOnly......