SpringBoot 中异常处理

SpringBoot 中异常处理非常简单,通过@ControllerAdvice 和@ExceptionHandler 注解,可以实现自定义的统一异常处理模块。

对于 Controller 中所有未捕获的异常统一处理。@ExceptionHandler 中可以指定需要处理的异常类型。处理异常时,既可以通过@ResponseBody 注解,返回 Json 数据格式,也可以通过 ModelAndView 方法返回指定的页面。

需要注意的是,这种异常处理只能处理 Controller 层未捕获的异常,对于 Interceptor(拦截器)中的异常无效。

代码演示

@ControllerAdvice
@ResponseBody
public class ExceptionProcessor {
    @ExceptionHandler(value = Exception.class)
    public Map<String,String> errorHandler(Exception ex) {
		Map<String,String> map = new HashMap<>();
        map.put("code", "100");
        map.put("msg", ex.getMessage());
        return map;
    }
	
    @ExceptionHandler(value = ArithmeticException.class)
    public Map<String,String> errorHandler2(Exception ex) {
		Map<String,String> map = new HashMap<>();
        map.put("code", "200");
        map.put("msg", ex.getMessage());
        return map;
    }
}

上述代码有个处理方法,对应不同的异常类型,SpringBoot 会根据类型做出最优的匹配策略。因此,当有 ArithmeticException 异常的时候,会触发 errorHandler2 方法。

当 Controller 层有异常抛出的时候,会在当前类捕获并处理。当所有的异常处理结果都以 json 方式时,可以用 @RestControllerAdvice 代替 @ControllerAdvice ,这样就不需要添加使用@ResponseBody 注解了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

第12章 元编程与注解、反射第12章 元编程与注解、反射

反射(Reflection)是在运行时获取类的函数(方法)、属性、父类、接口、注解元数据、泛型信息等类的内部信息的机制。这些信息我们称之为 RTTI(Run-T...

962
来自专栏后端沉思录

自定义参数解析器

开发中,app端给服务端会传基础参数、其他参数,一般基础参数app端都会传给服务端,其他参数则是根据不同接口传不同参数。若以表单的形式提交的数据:

1593
来自专栏技术墨客

Spring和性——数据的类型转换

在字符串到实体转换一文中介绍了Spring核心框架中使用PropertyEditor将任何字符串转换为数字、实体的方法。除了字符串到实体,Spring还提供了更...

1773
来自专栏vue

装箱和拆箱

 装箱和拆箱       1、装箱:值类型----->引用类型       2、拆箱:引用类型----->值类型       3、我们判断是否发生了拆箱或者装箱...

1164
来自专栏后端之路

Dubbo客户端返回自定义异常

虽然上一篇解决了message过长的问题 Dubbo自定义异常message过长解决 但是小伙伴仍然反映对于异常不能使用原类型而导致邮件报错太多(邮件报错基于错...

53310
来自专栏WD学习记录

Python数据结构与算法笔记(1)

ADT(abstract data type)是由用户定义的数据类型,它制定了一组数据值的集合及可作用在这些数据值上的一组操作。ADT的定义与它的具体实现无关,...

2223
来自专栏JavaEdge

SpringMVC数据绑定定义支持的数据绑定方式

定义 百度百科定义: 简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。 例如,如果一个开发者有一个Customer类...

4456
来自专栏强仔仔

freemarker常见的一些用法(一)

今天给大家介绍一下freemarker基本用法,例如:if、 list、 判断是否为空、获取值等等之类的。 在使用之前要先在模板中设置值,这里我使用的是Spri...

2529
来自专栏码匠的流水账

聊聊flink的MemoryBackendCheckpointStorage

本文主要研究一下flink的MemoryBackendCheckpointStorage

772
来自专栏海天一树

小朋友学C++(14):两数交换

之前学C语言的时候,咱们直接在main函数中使用“异或”位运算符,很容易实现了两数交换。 本节课将在此基础上,把交换两个数的算法,封装到swap函数中。这样不管...

2847

扫码关注云+社区