SpringBoot的异常处理_鱼蛋。的博客-程序员宅基地

技术标签: SpringBoot  SpringBoot的异常处理  

SpringBoot的异常处理

  1. 在SpringBoot的WEB应用中,如果控制器抛出异常,并没有处理的话,都会统一转发到一个error.html的错误结果页面,此页面由SpringBoot(spring-boot-starter-web)提供。
  2. SpringBoot的WEB应用中,会自动的提供一个映射,URL是/error,处理这个请求的类型是BasicErrorController,其中的处理逻辑是将异常信息封装到作用域中,并传递给视图’error’。
  3. 如果需要提供一个统一的错误页面处理异常,可以在系统中提供一个error.html来实现

BasicErrorController收集的错误信息包含:
error - 错误描述,如: Internal Server Error (服务内部错误)
exception - 异常类型, 如: java.lang. ArithmeticException
message - 异常描述, 如: / by zero
timestamp - 时间戳
status - 响应状态码, 如: 200, 500, 404等

##ExceptionHandler

  1. Spring支持异常的细致化处理,可以在控制器中定义若干方法,专门用于处理异常。处理异常的方法使用注解**@ExceptionHandler**来描述,注解的value属性是Class[]类型,代表该方法可以处理的异常种类。
  2. 这种异常处理方式力度较细,处理方式多样化。其缺陷是: 如果定义了太多的异常处理方法,会提升维护成本;且异常处理方法只对当前控制器有效。代码有bad smell。
  3. 这种开发方式适合针对性处理。因为定义在控制器中的异常处理方法处理优先级最高

##ControllerAdvice和ExceptionHandler

  1. SpringBoot可以独立定义一个类型作为ControllerAdvice(Controller的一种增强),类型需要使用@ControllerAdvice注解来描述,类型中可以定义若干异常处理方法,且方法使用@ExceptionHandler来描述。
  2. 当应用中发生异常时,异常的处理顺序是: 当前控制器中定义的@ExceptionHandler方法 -> @ControllerAdvice类中定义的@ExceptionHandler方法 -> BasicErrorController中定义的服务方法(error.html默认异常页面)
  3. 可以解决异常处理通用性。这种处理异常的方式,需要定义一个Advice类型和若干异常处理方法。
@ControllerAdvice
public class ExceptionControllerAdvice {

	private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionControllerAdvice.class);

	@ExceptionHandler(BusinessException.class)
	@ResponseBody
	public Result<?> handleBusinessException(HttpServletRequest request,
			Exception e) {
		return handleException(request, e, false);
	}

	@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
	@ResponseBody
	public ResponseEntity<Integer> handleMethodNotSupportedException(HttpServletRequest request,
			Exception e) {
		return ResponseEntity.badRequest().body(null);
	}

	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Result<?> handleOtherException(HttpServletRequest request,
			Exception e) {
		return handleException(request, e, true);
	}

	private Result<?> handleException(HttpServletRequest request,
			Exception e,
			boolean logger) {
		String errMsg = ExceptionUtils.getErrorMessage(e);
		String strError = StringUtils.isEmpty(errMsg) ? e.getMessage() : errMsg;
		ResultCode respondCode = ResultCode.get(strError);
		if (logger) {
			LOGGER.error(strError, e);
			e.printStackTrace();
		}
		if (respondCode == null) {
			return Result.error(strError);
		} else {
			return Result.create(respondCode);
		}
	}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Huang_Y_hui/article/details/100090128

智能推荐

代价函数的理解——也是讲的比较清楚的_wmz13248的博客-程序员宅基地_代价函数的等高线图里面的数据代表什么

现在我有一些数据集,就像上图中的叉。那么我想通过一个一次函数也叫线性回归函数(一条直线)去拟合这些数据,一次函数在没有确定之前,应该是这个样子的:其中 θ0 和 θ1 都是未知量。现在关键就是如何求 θ0 和 θ1 这两个参数。θ0 和 θ1 可以取任意值,怎么取值才能让这条直线最佳地拟合这些数据呢?这就是代价函数登场的时刻了。这就是一次函数的代价函数 J(θ0, θ1)。看到这个复杂的函数有没有头很晕的感觉呢?如果晕,没关系,让我们一步步来分析这个函数。判断拟合的这个函数是否准确就是判断通过这个函数的出来

初入运维职场的老男孩教育学员必须坚守的素质和态度!_weixin_34313182的博客-程序员宅基地

时间过的很快一晃又一个班毕业了。看到大家一个个找到了满意的工作,老男孩老师也是感觉很有成就啊,为了让大家再工作中发展的更好,给大家整理了10篇博文1、linux运维高薪就业指导(0基础新手获得10K+高薪必备)http://oldboy.blog.51cto.com/2561410/1655600老男孩超级强的就业指导课程,使得0基础运维班平均工资达到了12K。2、初入运维职场菜鸟必知必做的工作心...

css hover对其包含的元素进行样式设置_saysmy的博客-程序员宅基地

价格 对a链接包含的span图标进行样式更改。.icon-down-single-arr{ background-position: -67px -974px;}.icon-down-single-arr-li li:hover .icon-down-single-arr{ background-position: -81px -974px;

王爽《汇编语言》实验10_benben_dog的博客-程序员宅基地_汇编语言实验10

1.显示字符串编写一个通用的子程序,向调用者提供与显存无关的接口,方便调用者在窗口指定位置显示字符串的功能。assume cs:codedata segment db 'Welcome to masm!',0 ;要显示的字符串data endscode segmentstart: mov dh,8 ;行号 mov dl,3 ;列号 mov cl,2 ;指定...

YJJ's Salesman HDU - 6447(线段树 单点更新+DP思想)_LBJHan的博客-程序员宅基地

YJJ's Salesman题目链接:HDU - 6447 题意:一个1e9*1e9的地图,要求由(0, 0) -&amp;gt; (1e9, 1e9);只能向下,向右, 向右下移动;地图中有n个点,有宝藏,只有从该点的左上方移动过来才能拿走宝藏,问最多能拿走多少宝藏;本题和之前做过的一个数星星题有点相似, 题目链接:POJ - 2352   根据题意可知在每一个点能拿到的宝藏一定是其左上...

随便推点

Hibernate关联关系映射_dream_heheda的博客-程序员宅基地

本文参考 谈一点我对hibernate关联关系映射的看法Hibernate关联关系映射--级联功能Hibernate作为持久层框架,初始实现最基本的ORM之外,最重要的就是关系关联映射。通过配置实体间的关联,如one-to-one、one-to-many等,可以实现级联保存,级联更新,级联查询,级联删除等级联操作。在建关联关系表的时候,可以通过设置@OneToOne,@@OneToMany,@@ManyToOne,@ManyToMany的cascade()属性值,来设置关系表之间的级联功能。举例

编辑器Ultraedit快捷键_weixin_34032779的博客-程序员宅基地

编辑器Ultraedit快捷键说到编辑器的快捷键,VIM是无与伦比的。要反对,也得是带脚踏板的EmaCS。UE还是有差距的,很大差距。注意:VIM是开源、免费的,而UE则需要注册。UE是Windows下最好的编辑器——如果没有GVIM和Emacs的话。而VIM和Emacs则是任何操作系统下最好的编辑器。198 自动换行 CTRL + W199 插入当前日期/时间 F7200 找到匹配的括号 (,[...

bzoj 3672: [Noi2014]购票_lqybzx的博客-程序员宅基地

Description 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会。       全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号。其中SZ市的编号为 1。对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市

点云数据集_这个昵称叫什么好呢的博客-程序员宅基地_abc点云数据集

点云数据集总结 三维点云数据,三维深度学习 1.ShapeNet ShapeNet是一个丰富标注的大规模点云数据集,其中包含了55中常见的物品类别和513000个三维模型。 2.ShapeNetSem 这是一个小的数据库,包含了270类的12000个物体。 ...

后端接受前端的参数类型(前端传递参数给后端)_姜无忧的博客-程序员宅基地_后端用类接受 前端如何传值

参数传递形式: Get请求 参数放到url后面,用&amp;amp;隔开即可Post请求 传递的参数的形式就比较多了。。。。一、普通的键值对参数:get请求实质也是键值对的形式二、list传值也可以把list对象放到对象里面三、Map类型或实体类类型传值,即json格式传值实体类接受的参数,可以其中的一个,也可以是全部的参数,,即有什么字段对应上,就会传递响...

关于 Diffie-Hellman 组_bytxl的博客-程序员宅基地

Diffie-Hellman (DH) 组确定了在密钥交换进程中使用的密钥的强度。 组的编号越大安全性就越高,但是也就需要更多的时间来计算密钥。WatchGuard 设备支持 Diffie-Hellman 组 1、2 和 5。DH 组 1: 768 位组DH 组 2: 1024 位组DH 组 5: 1536 位组VPN 交换中的两个对等方必须使用同一 DH 组,该组在 IPSe

推荐文章

热门文章

相关标签