Spring的全局(统一)异常处理
一,为什么要有全局异常处理
听到“全局异常处理”这个名字之后,我楞了三秒,虽然不知道它具体是什么,具体要怎么做,但是通过名字种的“异常处理”让我感觉到它大概可能是在编程中处理异常(当然异常我是懂的)的一种方式,此时此刻让我想起了平时处理异常常用的”try、catch、finally、throw、throws“这么几个东西;因为听到的原话是“Spring的全局异常处理”,此时此刻,我感觉它可能是Spring为程序开发人员提供的一种更方便、友好、简单......的处理异常的方式吧。
再结合”全局“这个定语,难道它可以让所有的异常在全局的位置一下子处理了?而不是像try...catch似的一个分布在代码中一个异常位置处理一次(当然,这句是看了全局异常之后才学到的,为了文章的理解需要先怼上来,嘿嘿)。
1)try...catch的弊端
①处理繁琐
编写程序的过程中,不可避免的需要在各种地方处理各种异常,所以代码中就会出现大量的try {...} catch {...} finally {...}
代码块与处理业务的代码搅合在一起,不仅有大量的冗余代码,而且还影响代码的可读性。
②解决不了一异常
try...catch捕获不了参数异常,(--------------------------代码示例)
2)定义类似BaseController的基类
一个正儿八经简简单单的Controller去继承一个处理异常的类?
二,异常处理的三种方式
1,实现HandlerExceptionResolver接口
2,@ExceptionHandler
3,@ControllerAdvice+@ExceptionHandler
三,@ExceptionHandler+@ControllerAdvice的全局异常处理方式(诞生于Spring3.2)
ExceptionHandler,英译汉:异常处理器,实际作用:如果在某个Controller类中定义一个异常处理方法,并在方法上添加该注解,当出现指定的异常时,会执行该处理异常的方法。
此时,就需要为每个Controller类都定义一个这样的异常处理方法,但异常的种类很多,如果需要将不同的异常分类处理,就要为每种异常定义一个异常处理方法,于是:每个Controller类都有对每种异常处理的方法——大量的代码冗余、复杂的编程以及困难的维护(如果需要新增一种异常的处理,就需要为每个Controller类添加一个对该异常处理的方法。
@ControllerAdvice闪亮登场!
该注解(@ControllerAdvice)可以把异常处理器(被@ExceptionHandler注解的方法)应用到所有的Controller,而不是单单的一个Controller类。
全局异常处理的原理:在独立的一个类中,定义一套对各种异常的处理机制,然后用@ControllerAdvice注解该类,统一对不同位置的不同异常进行处理。
四,代码实践
(1)操作步骤
①在包exception中创建处理异常的类(处理异常的类只能扫描到同一层级以及下一级中的文件,如果将该类放在web包中,将只能处理web包下的异常),这时便可以处理和exception包同一级的web下的异常了:
②在controller的异常
③设置统一处理异常的类
//通过使用@ControllerAdvice定义统一的异常处理类,而不是每个Controller种逐个定义
@ControllerAdvice
public class ErrorControllerAdvice {//注解:出现异常会来到这个方法处理//参数:捕获控制器出现的异常,可传入集合捕获多种类型的异常@ExceptionHandler(RuntimeException.class)public void handlerError(RuntimeException ex, HandlerMethod hm){System.out.println("统一异常处理");System.out.println(ex.getMessage());//异常信息System.out.println(hm.getBean().getClass());//哪个类下System.out.println(hm.getMethod().getName());//在哪个方法的}
}
(2)代码分析
@ExceptionHandler
作用:用来定义针对某种异常的异常处理方法
参数:定义该异常处理器捕获控制器里面出现的哪些异常;可传入集合。
比如,传RuntimeException.class,该处理方法只会捕获RuntimeException异常进行处理。
从源码可指,参数为指定方法处理哪个异常,如果不设置,默认是捕获方法里面参数传的异常,可以通过数组传入多个异常
@ControllerAdvice:通过使用该注解定义同i的异常处理类,而不是在每个Controller中逐个通过注解@ExceptionHandler定义异常处理方法;
从RestControllerAdvice的源码可知,该注解的一个重要参数是value是basePackages的别名,设定该类要捕获哪些包的异常,是String数组类型。
方法参数
可以穿入web环境的对象,比如传入RuntimeException对象可拿到异常信息,传入HandlerMethod,表示当前访问的出现异常的控制器方法,从而可得到出现异常的类、方法名等;
(3)运行结果:
不处理异常前:
此时,异常被捕获,同时在控制台打印相应信息,不会在控制台打印长长的错误信息,同时前端不会显示错误信息。
此外,可将异常信息保存到日志,并重定向至另一个界面进行为用户显示,或进行其他的处理。
//通过使用@ControllerAdvice定义统一的异常处理类,而不是每个Controller种逐个定义
//@ControllerAdvice
public class ErrorControllerAdvice {@ExceptionHandler(Exception.class)public void handlerError2(Exception ex){try {FileOutputStream fos = new FileOutputStream("d:\\spingLog.log");PrintStream ps = new PrintStream(fos);Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(date)+"------------------------";ps.println();ps.print(time);//将错误喜喜写入到日志文件ex.printStackTrace(ps);} catch (FileNotFoundException e) {e.printStackTrace();}//return "";//可以重定向到一个页面}
}
日志文件:
有了个基本的理解,反正感觉还有点乱,对于深入的内容,以后再接再厉!
Spring的全局(统一)异常处理相关推荐
- Spring中Controller层、Filter层、Interceptor层全局统一异常处理
Controller层.Filter层.Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结 ...
- 基于spring boot的统一异常处理
基于spring boot的统一异常处理 参考文章: (1)基于spring boot的统一异常处理 (2)https://www.cnblogs.com/knyel/p/7804237.html 备 ...
- Spring Boot学习——统一异常处理
Spring Boot学习--统一异常处理 参考文章: (1)Spring Boot学习--统一异常处理 (2)https://www.cnblogs.com/aston/p/7258834.html ...
- Spring 中的统一异常处理
在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此,肯定需要在Controller捕获所有异常,并且做适当处理,返回给前端一个友好的错误码. 不过 ...
- Spring Cloud Zuul统一异常处理
一.在zuul的errorfilter中处理(我使用的这种) package com.mortals.iot.module.common.interceptor;import com.alibaba. ...
- Spring Cloud中统一异常处理是怎么做的?
作者:BNDong www.cnblogs.com/bndong/p/10135370.html 在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送 ...
- Spring Cloud 如何统一异常处理?写得太好了!
欢迎关注方志朋的博客,回复"666"获面试宝典 作者:BNDong 链接:www.cnblogs.com/bndong/p/10135370.html 前言 在启动应用时会发现在控 ...
- Spring Cloud:统一异常处理
作者:BNDong www.cnblogs.com/bndong/p/10135370.html 在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送 ...
- Spring Cloud:统一异常处理
在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送异常错误时,Spring Boot 会根据请求方式分别跳转到以 JSON 格式或以界面显示的 /e ...
- spring boot 全局统一日志打印
欢迎关注本人公众号 概述 本文以使用spring boot或者springmvc为例. 微服务之间调用,或者controller接收请求时,为了方便排查问题,通常会将入参与出参(返回值)打印出来. 为 ...
最新文章
- 科创板首发过会,格灵深瞳“三变”交出IPO答卷
- 轻gc和重gc分别在什么时候发生_GC发展与现状
- 对HashMap对象的键值对内容进行排序
- 当程序员,你应该懂的法则
- 让你的网站首页自动选择语言转跳
- Django(四):模型层Model
- java简单的学生管理系统界面_java 学生信息管理系统(图形界面)
- 三菱PLC漏型源型总结
- SpringMVC中get请求中文乱码问题
- 那些编程中遇到的常见英文缩写
- 于的繁体字有几种写法_【于字书法繁体字怎么写】作文写作问答 - 归教作文网...
- SASE 本质探究(1):什么是云化
- java路径的上一级_java路径两种写法/和\\以及 ./和../以及/之间的区别?
- B站商业化驶入深水区
- JAVA家庭记账软件
- 404 Note Found队 Alpha7
- CC2530定时器1使能
- 提取文件夹中图片名字
- 最全的数据结构归纳总结
- 以前seo和现在seo的区别和演变