当前位置:网站首页>项目必用的全局异常处理器,你学会了吗
项目必用的全局异常处理器,你学会了吗
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全局异常处理
边栏推荐
- LeetCode 344. Reverse string
- Swift control encapsulation - paging controller
- 那个程序员,被打了。
- The market is relatively weak recently
- PHP merges multiple arrays. The same element takes the intersection of different elements to form an array
- 遇到女司机业余开滴滴,日入500!
- ESP8266 FreeRTOS开发环境搭建
- Latex插入的eps图片模糊解决方法
- 121. thread scheduling: join() method and yield() method
- 全球基金和资管的股票建仓率达到15年内新低
猜你喜欢

遇到女司机业余开滴滴,日入500!

Meituan P4 carefully collated microservice system architecture design manual to see the world of microservice architecture

【无标题】

Swift control encapsulation - paging controller

架构实战营 模块九:设计电商秒杀系统

Live broadcast management project

HMS core audio editing service 3D audio technology helps create an immersive auditory feast

PHP code audit and File Inclusion Vulnerability

Dotnet console uses microsoft Maui. Getting started with graphics and skia

计网01-物理层
随机推荐
嵌入式开发用到的一些工具
新数据库时代,不要只学 Oracle、MySQL
Spark's action operator
IPv6 learning notes
CSDN一站式云服务开放内测,诚邀新老用户来抢鲜
PHP code audit and File Inclusion Vulnerability
JS prototype chain
Cortex M4 systick details
SQL 化是 ETL 增量生产的第一步,这样的架构的核心能力是什么?
mysql截取_mysql截取字符串的方法[通俗易懂]
Construction of esp8266 FreeRTOS development environment
tryhackme圣诞挑战2021-Advent of Cyber 3-day1-IDOR漏洞,不安全的访问控制漏洞
js作用域链与闭包
SQL学习笔记(03)——数据约束关系
Win11账号被锁定无法登录怎么办?Win11账号被锁定无法登录
吃一个女富豪的瓜。。。
js 使用toString 区分Object、Array
Ubuntu system installation and MySQL configuration
4hutool实战:DateUtil-格式化时间[通俗易懂]
Unity tips for reducing the amount of code -- empty protection extension