web应用中的异常处理
楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法。
但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boot),所以会有相应特定的异常处理方法,这篇文章要介绍的就是web应用中的异常处理。
想快速解决问题的小伙伴可以只看“解决办法”,想进一步了解细节的小伙伴还可以看“深入剖析”部分。
适用场景
使用Spring MVC或Spring Boot框架搭建的web应用
解决办法
@ControllerAdvice注解 + @ExceptionHandler注解
实现一个异常处理类,在类上应用@ControllerAdvice注解,并在异常处理方法上应用@ExceptionHandler注解。那么在web应用中,当Controller的@RequestMapping方法抛出指定的异常类型时,@ExceptionHandler修饰的异常处理方法就会执行。
示例:
@ControllerAdvice public class WebServerExceptionHandler { Logger log = LoggerFactory.getLogger(this.getClass()); public WebServerExceptionHandler() { } // 指定捕获的异常类型,这里是自定义的SomeException @ExceptionHandler({SomeException.class}) public ResponseEntity<WebServerExceptionResponse> handle(HttpServletResponse response, SomeException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info("handle SomeException, status:{}, message:{}", new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); } // 指定捕获的异常类型,这里是自定义的OtherException @ExceptionHandler({OtherException.class}) public ResponseEntity<WebServerExceptionResponse> handle(HttpServletResponse response, OtherException ex) { WebServerExceptionResponse body = new WebServerExceptionResponse(); body.setStatus(ex.getStatus()); body.setMessage(ex.getMessage()); this.log.info("handle OtherException, status:{}, message:{}", new Object[]{body.getStatus(), body.getMessage()}); return new ResponseEntity(body, HttpStatus.valueOf(ex.getStatus())); } }
深入剖析
@ControllerAdvice的定义如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { String[] value() default {}; String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] assignableTypes() default {}; Class<? extends Annotation>[] annotations() default {}; }
可以看出它应用在TYPE类型的元素上(也即class或interface),运行时生效。
作用是Controller类的帮助注解,一般搭配@ExceptionHandler注解,用来处理Controller的@RequestMapping修饰的方法抛出的异常。
楼主根据源码的注释整理了5个参数的含义,它们都是用来限定需要处理的Controller的:
value():等同于basePackages,表示需要被处理的Controller包名数组,例如 @ControllerAdvice("org.my.pkg")。如果不指定,就代表处理所有的Controller类
basePackages():表示需要被处理的Controller包名数组,例如 @ControllerAdvice(basePackages={"org.my.pkg","org.my.other.pkg"})
basePackageClasses():通过标记类来指定Controller包名数组
assignableTypes():通过类的Class对象来指定Controller包名数组
annotations():被注解修饰的Controller需要被处理
性能考虑:不要指定过多的参数和异常处理策略,因为异常检查和处理都是在运行时做的。
@ExceptionHandler的定义如下:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { /** * Exceptions handled by the annotated method. If empty, will default to any * exceptions listed in the method argument list. */ Class<? extends Throwable>[] value() default {}; }
可以看出它作用在方法上面,而且参数很好理解,就是需要处理的异常类的Class对象数组。
但是,它对修饰的异常处理方法的参数和返回值有限定,楼主根据源码的注释整理如下:
(1)异常处理方法的参数限定,可以是以下类型,顺序任意:
- 异常类对象
HttpServletRequest、HttpServletResponse
HttpSession
InputStream/Reader、OutputStream/Writer
(2)异常处理方法的返回值限定,最终会写入response流:
ResponseEntity
HttpServletResponse
ModelAndView
Model
Map
View
总结
以上就是在Spring web应用中的异常处理方法:使用@ControllerAdvice搭配@ExceptionHandler修饰自定义异常处理方法,处理来自Controller类中的@RequestMapping方法抛出的异常。
使用时需要根据实际情况,合理设置@ControllerAdvice和@ExceptionHandler的参数。
web应用中的异常处理的更多相关文章
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
- 2017.10.28 针对Java Web应用中错误异常处理方法的运用
针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...
- 【Web】Web开发中的异常处理方案
我认为最合理的做法: 1.dao层不捕获异常.不抛出异常:spring框架将底层的数据库checked异常封装成unchecked异常了 2.service层捕获异常,并抛出自定义unchecked异 ...
- (五)web服务中的异常处理
一.服务端发布服务 package com.webservice; import javax.jws.WebParam; import javax.jws.WebResult; import java ...
- Java web的几种异常处理 (转)
一.在servlet容器中处理异常 以下两种方式: 1. 在web.xml定义异常处理 如果没有在web的应用中作异常处理,那么异常就会抛给Servlet容器,应该说此时Servlet容器是处理异常 ...
- 转:Spring Boot应用中的异常处理
引自:https://www.cnblogs.com/yangfanexp/p/7616570.html 楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异 ...
- 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理
原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其 ...
- WEB 项目中的全局异常处理
在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...
随机推荐
- MongoDB分布式集群搭建(分片加副本集)
# 环境准备 服务器 # 环境搭建 文件配置和目录添加 新建目录的操作要在三台机器中进行,为配置服务器新建数据目录和日志目录 mkdir -p $MONGODB_HOME/config/data mk ...
- Java架构师系统培训高并发分布式电商实战activemq,netty,nginx,redis dubbo shiro jvm虚拟机视频教程下载
15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...
- [2013-06-05]bat脚本设置DNS
有时候需要切换本机dns,将网络环境转至测试环境 @echo off netsh interface ip set dns name="本地连接" source=static ad ...
- linux ls 命令
ls 命令是 Linux 下最常用的命令之一,用来查询目录下的内容(list directory contents).本文将介绍其基本的用法和一些典型的用例.笔者使用的测试环境为 ubuntu 16. ...
- css 禁止长按保存功能
*{-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} 或者指定某个元 ...
- 带你走进SAP项目实施过程——立项(1)
到底谁会首先有上ERP的想法,可能是企业老板,也可能是总经理级别等高管.但不管是谁,在确定之前,按道理企业风控部.总经办或者信息部等相关部门都需要对ERP项目做立项申请.毕竟ERP项目涉及企业方方面面 ...
- 通过ssh协议实现用户key认证登录
author:JevonWei 版权声明:原创作品 用户实现key认证登录 主机A 192.168.198,134 主机B 192.168.198,131 主机C 192.168.198,136 创建 ...
- 三、nginx实现反向代理负载均衡
1.反向代理 需求: 两个tomcat服务通过nginx反向代理 nginx服务器:192.168.101.3 tomcat1服务器:192.168.101.5 tomcat2服务器:192.168. ...
- 关系型数据库和NOSQL数据库对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt328 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概 ...
- 必应词典--英语学习APP案例分析
一.调研,评测 1.个人上手体验 这还是第一次听说必应词典,只能说知名度有待提高啊.首先,下载打开必应词典的第一感觉就是不够美观,个人感觉不论图标还是界面的美感都不足,既繁琐有简洁,给人的最直观感受就 ...