当前位置:网站首页>项目必用的全局异常处理器,你学会了吗
项目必用的全局异常处理器,你学会了吗
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全局异常处理
边栏推荐
- Rich text interpolation
- Spark's action operator
- Dotnet console uses microsoft Maui. Getting started with graphics and skia
- js重写自己的函数
- The market is relatively weak recently
- ES6-const本质与完全不可改实现(Object.freeze)
- Matrix and coordinates
- IPv6 learning notes
- SQL学习笔记(04)——数据更新、查询操作
- Short circuit operator lazy evaluation
猜你喜欢

京东与腾讯续签三年战略合作协议;起薪涨至26万元!韩国三星SK争相加薪留住半导体人才;Firefox 102 发布|极客头条...

Import and export of power platform platform sharepointlist

华为帐号多端协同,打造美好互联生活

Hololens2 development -6-eyetracking and speech recognition

【无标题】

硬件中台项目

历史上的今天:九十年代末的半导体大战;冯·诺依曼发表第一份草案;CBS 收购 CNET...

SQL learning notes (01) - basic knowledge of database

一个悄然崛起的国产软件,低调又强大!

Who has the vision to cross the cycle?
随机推荐
JS prototype inheritance can only inherit instances, not constructors
PHP array functions (merge, split, append, find, delete, etc.)
Precautions for lvgl v8.2 string display on keil MDK (take little bear pie as an example)
Differences between JS valueof and toString
Using closures to implement private variables
硬件中台项目
ES6 const essence and completely immutable implementation (object.free)
js变量提升(hoisting)
CSDN一站式云服务开放内测,诚邀新老用户来抢鲜
Cortex M4 systick details
Network partition notes
PO模式深入封装
button按钮清除边框
Rich text interpolation
HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴
Win11账号被锁定无法登录怎么办?Win11账号被锁定无法登录
Introduction to mt7628k eCos development
集成积木报表报错 org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常
Dotnet console uses microsoft Maui. Getting started with graphics and skia
SQL learning notes (01) - basic knowledge of database