网站首页 > java教程 正文
作者:韩数
前言:

在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是throws直接抛出,一种是使用try..catch捕获,一般的话,如果逻辑的异常,需要知道异常信息,我们往往选择将异常抛出,如果只是要保证程序在出错的情况下 依然可以继续运行,则使用try..catch来捕获。
但是try..catch会导致代码量的增加,让后期我们的代码变得臃肿且难以维护。当然,springboot作为一个如此优秀的框架,肯定不会坐视不管的,通过springboot自带的注解,我们可以方便的自定义我们的全局异常处理器,并且以json格式返回给我们的客户端。
代码实战:
捕获全局异常:
首先呢,我们新建我们负责全局异常捕捉处理的类:MyControllerAdvice,代码如下:
@ControllerAdvice
public class MyControllerAdvice {
?
?
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map<String,Object> exceptionHandler(Exception ex){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",100);
map.put("msg",ex.getMessage());
//这里可以加上我们其他的异常处理代码,比如日志记录,,,
return map;
}
?
}
?
注解说明:
@ControllerAdvice 通过AOP的方式配合@ExceptionHandler()注解捕获在Controller层面发生的异常。如果需要扫描自定路径下的Controller,添加basePackages属性
@ControllerAdvice(basePackages ="com.example.demo.controller")
@RestControllerAdvice : 和@ControllerAdvice作用相同,可以理解为 @ResponseBody+@ControllerAdvice 的组合使用。
@ExceptionHandler():该注解作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。
测试:
@RestController
public class UserController {
?
?
@GetMapping("/test")
public String test(){
int num = 1/0;
return "Hello World";
}
?
?
}
结果:
{"msg":"/ by zero","code":100}
捕获自定义异常:
自定义我们的异常信息类MyException 并继承RuntimeException:
public class MyException extends RuntimeException {
?
private String errorCode;
private String errorMsg;
?
public MyException(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
?
?
public String getErrorCode() {
return errorCode;
}
?
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
?
public String getErrorMsg() {
return errorMsg;
}
?
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
?
修改我们的MyControllerAdvice,将MyException添加进去:
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map<String,Object> myExceptionHandler(MyException mex){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",mex.getErrorCode());
map.put("msg",mex.getErrorMsg());
//其他业务代码...
return map;
}
测试:
@GetMapping("/test1")
public String test1(){
String name = null;
if(name == null){
throw new MyException("101","用户名为空");
}
return "Hello World";
}
输出:
{"msg":"用户名为空","code":"101"}
完成~
我是小架,欢迎关注我
猜你喜欢
- 2024-11-06 Java核心知识3:异常机制详解(java的三种核心机制是什么)
- 2024-11-06 【Spring系列】05 自定义异常以及全局异常处理器 #java
- 2024-11-06 3种Sentinel自定义异常,你用过几种?
- 2024-11-06 关于Java Exception异常的深入用法及实例
- 2024-11-06 Java-throw异常详解以及过程(java throw exception)
- 2024-11-06 《JAVA编程思想》5分钟速成:第12章(异常)
- 2024-11-06 面试官:java开发中异常怎么定义好 程序员:不知道
- 2024-11-06 「译」11条Java异常处理的最佳实践
- 2024-11-06 Java入门教程十一(异常处理)(java异常处理的三种方法)
- 2024-11-06 Java,你管这叫异常?(java异常是什么意思)
欢迎 你 发表评论:
- 11-07宽带测速网页版(在线宽带测速工具)
- 11-07联想笔记本商务办公哪款好(联想商务笔记本哪个好)
- 11-07联想笔记本怎么调亮度(笔记本电脑亮度调节)
- 11-07pc端(pc端是啥)
- 11-07下载手机客户端app(客户端怎么下载)
- 11-07windows10补丁更新(windows10更新补丁在哪个文件夹)
- 11-07win7截图四种方式(win7如何截图屏幕截图)
- 11-07笔记本声音没有了怎么恢复(笔记本声音没有了怎么修复)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)

本文暂时没有评论,来添加一个吧(●'◡'●)