当前位置:网站首页>项目必用的全局异常处理器,你学会了吗
项目必用的全局异常处理器,你学会了吗
2022-07-01 09:41:00 【昔年1206】
前言
想必在平时写项目得时候,一定遇到过出现异常得情况,比如空指针啊、数据越界、类型转化什么得。每次我们都要自己去处理这个异常,但是一个项目中可能有多个需要处理得地方,我们总不能每次都处理,多费事啊,这个时候肯定想到的是将这个异常的处理抽取出来。统一的处理,所以我们的全局异常处理就出现了。
有两点很重要——异常处理的思想、全局异常就是把异常处理放在一个类中进行统一处理。
干货
上面说到全局异常就是一个类作为统一处理异常地方,所以我们只需要顶一个全局异常处理类就行了
package com.xinian.springclud_demo.exception;
import com.xinian.springclud_demo.common.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.sql.ResultSet;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = BusinessException.class)
public Result zdyExceptionHandeler (BusinessException e){
System.out.println("全局异常1");
log.error(e.getErrorMeg(),e);
return Result.builder().data(e).build();
}
@ExceptionHandler(Exception.class)
public Result exceptionHandler(Exception e){
System.out.println("全局异常2");
log.error(e.getMessage(),e);
return Result.builder().data(e).build();
}
}
注意点
- @RestControllerAdvice 对controller进行增强,能够拦截所有SpringMVC产生的异常情况
- ExceptionHandler 通过后面的参数指定异常情况是进入哪个方法进行处理
下面就是写异常的代码了,不是全局异常代码的内容
package com.xinian.springclud_demo.controller;
import com.xinian.springclud_demo.common.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestException {
@GetMapping("/a")
public Result query(){
int i=1/0;
Result result = new Result(true,"好",200,"hh");
return result;
}
}
运行结果
这不就拦截到了嘛!
就此全局异常拦截器已经说完了,下面说的是根据这个东西。如何融入到项目当中。构造出一个项目的基础框架。
- 凡是项目肯定是返回值,首先构造一个项目的返回值类型吧!
package com.xinian.springclud_demo.common;
import com.xinian.springclud_demo.enums.StatusEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result {
/** * 是否成功 */
private Boolean success;
/** * 返回消息 */
private String message;
/** * 返回编码 */
private Integer code;
/** * 返回数据 */
private Object data;
/** * 成功 * * @return */
public static Result success() {
return success(null);
}
/** * 成功 * @param data * @return */
public static Result success(Object data) {
Result rb = new Result();
rb.setCode(StatusEnum.SUCCESS.getErrorCode());
rb.setMessage(StatusEnum.SUCCESS.getErrorMsg());
rb.setData(data);
return rb;
}
/** * 失败 */
public static Result error() {
Result rb = new Result();
rb.setCode(StatusEnum.FAIL.getErrorCode());
rb.setMessage(StatusEnum.FAIL.getErrorMsg());
rb.setData(null);
return rb;
}
/** * 失败 */
public static Result error( String message) {
Result rb = new Result();
rb.setCode(-1);
rb.setMessage(message);
rb.setData(null);
return rb;
}
}
返回值类型定义好,但是我们返回的状态其实有很多种情况的,所以我们最后定义一个枚举将所有的状态列举出来,我这里就使用了两个
package com.xinian.springclud_demo.enums;
import lombok.Data;
public enum StatusEnum {
SUCCESS (200,"成功"),
NO_PERMISSION(403, "你无权访问"),
NO_Auth(401, "未授权,请登录验证"),
NO_FOUND(404, "未找到资源"),
INTERNAL_SERVER_ERROR(500, "服务器异常, 请联系管理员!"),
FAIL(502,"失败");
private Integer errorCode;
private String errorMsg;
StatusEnum(Integer errorCode,String errorMsg){
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public Integer getErrorCode() {
return errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
}
如果官方规定的异常情况不能满足你的要求 你还可以自定义异常。
只需要你去继承一个RuntimeException就可以了。
package com.xinian.springclud_demo.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BusinessException extends RuntimeException{
/** * 错误编码 */
protected Integer errorCode;
/** * 错误提示 */
protected String errorMeg;
}
运行结果
这就是所谓的全局异常处理。是不是很简单啊,只需要一个类就可以了,这就是所谓的抽取
详细代码请查看springboot全局异常处理
边栏推荐
- Network counting 01 physical layer
- delete和delete[]引发的问题
- Tearful eyes, it's not easy to change jobs. Three rounds of interviews, four hours of soul torture
- The market is relatively weak recently
- JS原型链
- 闭包实现迭代器效果
- [unity shader] substitution of bool type in the property definition
- 这样理解mmap,挺有意思!
- Project procurement management
- Introduction to mt7628k eCos development
猜你喜欢

Hardware midrange project

Hololens2 development -6-eyetracking and speech recognition
![[untitled]](/img/1a/e18918cc09db9b072759409a5f39a1.png)
[untitled]

MapReduce programming basics

Live broadcast management project

Cortex M4 systick details

CSDN's one-stop cloud service is open for internal testing, and new and old users are sincerely invited to grab the fresh

Huawei accounts work together at multiple ends to create a better internet life

计网01-物理层

全球基金和资管的股票建仓率达到15年内新低
随机推荐
Comparison between Oracle JDK and openjdk
Analysis and solution of JS this loss
我喜欢两个男人。。。
js变量提升(hoisting)
新数据库时代,不要只学 Oracle、MySQL
手指点击屏幕就模拟进入F11进入全屏
js重写自己的函数
[unity rendering] customized screen post-processing
ES6 const essence and completely immutable implementation (object.free)
[unity shader] substitution of bool type in the property definition
UE small knowledge point controller possess pawn process
IPv6 learning notes
云原生到底是什么?它会是未来发展的趋势吗?
123. how to stop a thread?
主流实时流处理计算框架Flink初体验
js作用域链与闭包
Meituan P4 carefully collated microservice system architecture design manual to see the world of microservice architecture
Sd-wan notes
Wechat emoticons are written into the judgment, and the OK and bomb you send may become "testimony in court"
button按钮清除边框