全局异常处理总结

news/2024/7/3 10:36:12

目录

    • WEB.XML
    • Spring全局异常,Controller增强方式( Advising Controllers)
    • Spirng全局异常,配置方式
    • Sping全局异常,自定义异常类和异常解析
    • Errors and REST
    • 推荐文章


WEB.XML

就是指定error-code和page到指定地址,这也是最传统和常见的做法
web.xml:

 <error-page>
     <error-code>404</error-code>
     <location>/404</location>
 </error-page>
 <error-page>
     <error-code>500</error-code>
     <location>/500</location>
 </error-page>

 <!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 -->
 <error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/uncaughtException</location>
 </error-page>

applicationContext.xml:

<!-- 错误路径和错误页面,注意指定viewResolver -->
<mvc:view-controller path="/404" view-name="404"/>
<mvc:view-controller path="/500" view-name="500"/>
<mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>

Spring全局异常,Controller增强方式( Advising Controllers)

异常抛出:

@Controller
public class MainController {
    @ResponseBody
    @RequestMapping("/")
    public String testException(){
        throw new NullPointerException("NullPointerException Test!");
    }
}

异常捕获:

//注意使用注解@ControllerAdvice作用域是全局Controller范围,即必须与抛出异常的method在同一个controller
//可应用到所有@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler

@ControllerAdvice
public class AControllerAdvice {
   
   @ExceptionHandler(NullPointerException.class)
   @ResponseStatus(HttpStatus.BAD_REQUEST)
   @ResponseBody
   public String handleIOException(NullPointerException ex) {
       return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
   }
   
}

为了确保@ResponseStatus标注的异常被Spring框架处理,可以这样编写全局异常处理类:

@ControllerAdvice
class GlobalDefaultExceptionHandler {
    public static final String DEFAULT_ERROR_VIEW = "error";

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {

        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
            throw e;

        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        mav.setViewName(DEFAULT_ERROR_VIEW);
        return mav;
    }
}

Spirng全局异常,配置方式

异常抛出,同上!

异常捕获:

<!-- 全局异常配置 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 <property name="exceptionMappings">
     <props>
         <prop key="java.lang.Exception">errors/500</prop>
         <prop key="java.lang.Throwable">errors/500</prop>
     </props>
 </property>
 
 <property name="statusCodes">
      <props>
          <prop key="errors/500">500</prop>
      </props>
  </property>
  
  <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
  <property name="warnLogCategory" value="WARN"></property>
  
  <!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
  <property name="defaultErrorView" value="errors/500"></property>
  
  <!-- 默认HTTP状态码 -->
  <property name="defaultStatusCode" value="500"></property>
  
</bean>

对应500错误的view jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>500 Error</title>
    </head>
    <body>
        <% Exception ex = (Exception)request.getAttribute("exception"); %>
        <H2>Exception:<%= ex.getMessage()%></H2>
        <P/>
        <% ex.printStackTrace(new java.io.PrintWriter(out)); %>
    </body>
</html>

Sping全局异常,自定义异常类和异常解析

自定义异常类:

public class CustomException extends RuntimeException {

   public CustomException(){
       super();
   }

   public CustomException(String msg, Throwable cause){
       super(msg, cause);
       //Do something...
    }
}

抛出异常:

@ResponseBody
@RequestMapping("/ce")
public String ce(CustomException e){
    throw new CustomException("msg",e);
}

实现异常捕获接口HandlerExceptionResolver:

public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{

   @Override
   public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
       Map<String, Object> model = new HashMap<String, Object>();
       model.put("e", e);
       //这里可根据不同异常引起类做不同处理方式,本例做不同返回页面。
       String viewName = ClassUtils.getShortName(e.getClass());
       return new ModelAndView(viewName, model);
    }
    
}

新的的HandlerExceptionResolver实现类只需在配置文件中定义即可,可以配置优先级。DispatcherServlet初始化HandlerExceptionResolver的时候会自动寻找容器中实现了HandlerExceptionResolver接口的类,然后添加进来。配置Spring支持异常捕获:

<bean class="cn.bg.controller.CustomHandlerExceptionResolver"/>

Errors and REST

使用Restful的Controller可以使用@ResponseBody处理错误,首先定义一个错误:

public class ErrorInfo {
    public final String url;
    public final String ex;
    
    public ErrorInfo(String url, Exception ex) {
        this.url = url;
        this.ex = ex.getLocalizedMessage();
    }
}

通过一个@ResponseBody返回一个错误实例:

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MyBadDataException.class)
@ResponseBody ErrorInfo handleBadRequest(HttpServletRequest req, Exception ex) {
    return new ErrorInfo(req.getRequestURL(), ex);
} 

推荐文章

自定义异常及异常全局处理:
https://blog.csdn.net/qidasheng2012/article/details/84550539

全局异常处理实例
https://blog.csdn.net/qidasheng2012/article/details/84548833


http://www.niftyadmin.cn/n/2257461.html

相关文章

成都榆熙电子商务有限公司:店铺违规后可以补救吗?

既然选择了在拼多多开店&#xff0c;那么商家们就要遵守平台的规则&#xff0c;但是有的商家因为自己的一些错误操作导致店铺受到处罚&#xff0c;那么商家们经常会遇到哪些违规情况呢&#xff1f;可以补救吗&#xff1f;想要了解的小伙伴一起和榆熙电商小编来看看吧。 一、收…

Spring Security授权源码分析

授权是在用户认证通过后&#xff0c;对访问资源的权限进行检查的过程。 Spring Security使用标准 Filter建立了对 web请求的拦截&#xff0c;最终实现对资源的授权访问。 Spring Security过滤器链加载执行流程源码分析请查看&#xff1a;https://blog.csdn.net/qq_42402854/ar…

mysql迁移

目录 1.SQLyog 2.阿里云DTS 1.创建任务 2.配置源库及目标库信息 3.配置任务对象及高级配置 4.高级配置 1.SQLyog 适用于离线迁移&#xff0c;全量迁移&#xff0c;少量迁移&#xff0c;数据库大小在几百兆范围内&#xff0c;时间需要几十秒到几分钟不等。 选择源库&…

榆熙电商:PDD商家如何留住核心消费者?

一般来说&#xff0c;很多个人商家在拼多多开店之后对自己店铺的运营管理上都比较欠缺&#xff0c;对寻找目标用户以及用户定位管理等方面都很被动&#xff0c;等待流量自主上门往往会丧失店铺竞争力。作为拼多多商家&#xff0c;如何才能对目标用户有着清晰明确的认知呢&#…

Spring Security实现记住我功能源码分析

Spring Security 实现“记住我”功能&#xff0c;即自动登录功能有两种方式&#xff1a; 将 token写入到浏览器的 Cookie中将 token持久化到数据库 一、将 token写入到浏览器的 Cookie中 1、代码实现 1.1 后端 Spring Security默认是没有开启“记住我”功能&#xff0c;我们…

榆熙电商:为何购物旗舰店选择优于其他?

用户们在购买某个店铺的产品的时候&#xff0c;往往都是优先选择在旗舰店进行购买&#xff0c;那么该如何去分辨拼多多的旗舰店呢&#xff1f;旗舰店有哪些保障呢&#xff1f;一起和成都榆熙小编来了解一下吧。 一、用户如何识别官方旗舰店&#xff1f; 最简单的方法就是看店…

Spring Security CSRF防御源码分析

一、CSRF简介 1、CSRF是什么&#xff1f; CSRF&#xff08;Cross-site request forgery&#xff09;&#xff0c;也被称为&#xff1a;one click attack/session riding&#xff0c;中文名称&#xff1a;跨站请求伪造&#xff0c;通常缩写为&#xff1a;CSRF/XSRF。 跨站请求…

榆熙电商:拼多多商家如何优化用户春节期间的购物体验?

春节将至&#xff0c;在拼多多开店的商家很可能会面临合作物流方春节期间不发货的情况。拼多多商家面对这样的情况又该如何处理呢&#xff1f;今天榆熙电商小编就跟大家聊一聊&#xff0c;在拼多多开店&#xff0c;春节期间合作物流不发货怎么办&#xff1f; 一、拼多多春节放…