java controller 异常捕获
package com.aiyusheng.framework.exception; import lombok.Data; /**
* base异常类
* @author :cza
* @date :2020/11/25 15:57
* @description :
* @modyified By:
*/
@Data
public class BaseException extends Exception {
private String code; public BaseException(Throwable throwable){
super(throwable);
}
public BaseException(String msg){
super(msg);
}
public BaseException(String msg,Throwable throwable){
super(msg,throwable);
} @Deprecated
public BaseException(Throwable throwable,String msg,String code){
super(msg,throwable);
this.code=code;
}
}
package com.aiyusheng.framework.exception; import com.aiyusheng.framework.core.enums.ReturnCode;
import com.aiyusheng.framework.utils.CommUtil;
import lombok.Data; import javax.swing.plaf.PanelUI;
import java.io.Serializable; /**
* 业务异常类
* @author :cza
* @date :2020/11/25 15:57
* @description :
* @modyified By:
*/ public class BusinessException extends BaseException implements Serializable { private static final long serialVersionUID = -3598204678161713009L; /**
* 结果码
*/
private String code; /**
* 提示消息
*/
private String msg;
/**
* 提示消息,用于填充properties中的{}参数
*/
private String [] msgParams; /**
* 功能描述:不带信息参数的异常<br>
* @Param code
* @Param throwable
* @Return
* @Author: cza
* @Date: 2020-11-26
* */
public BusinessException(String code,Throwable throwable){
super(CommUtil.getResultMsg(code,null),throwable);
this.code=code;
this.setCode(code);
} /**
* 功能描述:不带信息参数的异常<br>
* @Param code
* @Param throwable
* @Return
* @Author: cza
* @Date: 2020-11-26
* */
public BusinessException(ReturnCode returnCode){
super(returnCode.getMsg());
this.setCode(returnCode.getCode());
} public BusinessException(ReturnCode returnCode,String [] msgParams,Throwable throwable){
super(CommUtil.getResultMsg(returnCode.getMsg(),msgParams),throwable);
this.code=returnCode.getCode();
//不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容
this.msgParams=msgParams.clone();
this.setCode(returnCode.getCode());
} /**
* 功能描述:带一个信息参数的异常
* @Param:
* @Return
* @Author: chenzhian
* @Date:2020-11-26
*/
public BusinessException(String code,String msgParam,Throwable throwable){
super(CommUtil.getResultMsg(code, new String [] {msgParam}),throwable);
this.code=code;
//不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容
this.msgParams[0]=msgParam;
this.setCode(code);
} /**
* 功能描述: 带多个信息参数的异常
* @Param:
* @param code
* @param msgParams
* @param throwable
* @Return:
* @Author: chenzhian
* @Date: 2020/11/26 15:43
* @Description:
*/
@Deprecated
public BusinessException(String code,String [] msgParams,Throwable throwable) {
super(CommUtil.getResultMsg(code,msgParams),throwable);
this.code=code;
//不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容
this.msgParams=msgParams.clone();
this.setCode(code);
} /**
* 功能描述: 带多个信息参数的异常
* @Param:
* @param code
* @param throwable
* @param msgParams
* @Return:
* @Author: chenzhian
* @Date: 2020/11/26 15:45
* @Description:
*/
public BusinessException(String code,Throwable throwable,String... msgParams) {
super(CommUtil.getResultMsg(code,msgParams),throwable);
this.code=code;
//不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容
this.msgParams=msgParams.clone();
this.setCode(code);
} /**
* 功能描述: 异常信息构造函数,用于FA框架反射调用
* @Param:
* @param resultMsg
* @Return:
* @Author: chenzhian
* @Date: 2020/11/26 15:46
* @Description:
*/
public BusinessException(String resultMsg){
super(resultMsg);
} @Override
public String getCode(){
return code;
} @Override
public void setCode(String code){
this.code=code;
} public String [] getMsgParams() {
//不直接返回msgParams引用为了代码安全,避免被未知调用者修改引用的内容
return msgParams.clone();
} public void setMsgParams(String [] msgParams){
//不直接复制msgParams引用为了代码安全,避免被未知调用者修改引用的内容
this.msgParams=msgParams.clone();
} /**
* 功能描述:
* @Param: [returnCode, msgParam, throwable]
* @Return:
* @Author:
* @Date: 2020/11/26 14:37
* @Description:
public BusinessException(ReturnCode returnCode,String msgParam,Throwable throwable){
super(CommUtil.getResultMsg(returnCode.getMsg(), new String [] {msgParam}),throwable);
this.code=returnCode.getCode();
//不直接传递引用是处于代码安全考虑,避免位置调用者修改引用内容
this.msgParams[0]=msgParam;
this.setCode(returnCode.getCode());
}*/
}
package com.aiyusheng.framework.core; import com.aiyusheng.framework.core.enums.ReturnCode;
import com.alibaba.fastjson.JSONPObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.shiro.crypto.hash.Hash; import java.io.Serializable;
import java.util.HashMap;
import java.util.Map; /**
* @author :cza
* @date :2020/11/26 20:41
* @description :
* @modyified By:
*/
@Data
@Accessors(chain = true)
public class ResponseResult<T> implements Serializable {
private String code;
private String msg;
private T data; public ResponseResult(){
this(ReturnCode.Common.SUCCESS,null);
}
public ResponseResult(T data){
this(ReturnCode.Common.SUCCESS,data);
}
public ResponseResult(ReturnCode returnCode){
this(returnCode,null);
}
public ResponseResult(ReturnCode returnCode,T data){
//this(returnCode,null);
this.code=returnCode.getCode();
this.msg=returnCode.getMsg();
}
public ResponseResult(String code,String msg){
this.code=code;
this.msg=msg;
this.data=transferNull2EmptyFloag?(T)"":null;
} public ResponseResult(String code,String msg,T data){
this.code=code;
this.msg=msg;
this.data=transNullToEmptyString(data);
} public static <T> ResponseResult<T> success(T data){
return new ResponseResult<>(data);
}
public static <T> ResponseResult<T> success(T data,String message){
return new ResponseResult<>(data).setMsg(message);
}
public static <T> ResponseResult<T> success(){
return new ResponseResult<>();
}
public static <T> ResponseResult<T> error(String errorMsg){
return new ResponseResult<>(ReturnCode.Common.RUNTIME_EXCEPTION.getCode(),errorMsg);
}
public static <T> ResponseResult<T> error(String errorCode,String errorMsg){
return new ResponseResult<>(errorCode,errorMsg);
} /**
* 功能描述:检查是否成功
* @Param:
* @Return: boolean
* @Author: chenzhian
* @Date: 2020/11/27 11:13
* @Description:
*/
public boolean checkResult(){
return ReturnCode.Common.SUCCESS.getCode().equals(code);
}
/**
* 功能描述:复制code和msg信息
* @Param:
* @Return: com.aiyusheng.framework.core.ResponseResult<M>
* @Author: chenzhian
* @Date: 2020/11/27 11:18
* @Description:
*/
public <M> ResponseResult<M> copy(){
return new ResponseResult<>(this.code,this.msg);
}
/**
* 功能描述: 复制code和msg信息,并设置data数据
* @Param:
* @Return: com.aiyusheng.framework.core.ResponseResult<M>
* @Author: chenzhian
* @Date: 2020/11/27 11:18
* @Description:
*/
public <M> ResponseResult<M> copyAndSetData(){
return new ResponseResult<>(this.code,this.msg);
} @Override
public String toString() {
Map<String,Object> jsonMap=new HashMap<>();
jsonMap.put("code",this.code);
jsonMap.put("msg",this.msg);
jsonMap.put("data",transNullToEmptyString(this.data));
return JSONPObject.toJSONString(jsonMap, SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteDateUseDateFormat);
} @Deprecated
private T transNullToEmptyString(T data) {
if(null==data){
return transferNull2EmptyFloag?(T)"":data;
}
return data;
} public static volatile boolean transferNull2EmptyFloag=false;
}
package com.aiyusheng.framework.core.enums; /**
* @author :cza
* @date :2020/11/26 11:15
* @description :
* @modyified By:
*/
public interface ReturnCode {
public String getCode();
public String getMsg();
public String getMsg(String code);
/**
* 功能描述:定义框架级别的编码 <br>
* @Param:
* @Return
* @Author:
* @Date:
*/
public enum Common implements ReturnCode{
/**
成功
*/
SUCCESS("00000","成功"),
/**
服务器繁忙 fixme
*/
BUSINESS_PROCESS_FAILED("950001","服务器繁忙"),
/*
字段校验非法
*/
INVAID_PARAM("940001","字段校验非法"),
/*
运行时异常
*/
INVAID_REQUEST_MSG("940001","运行时异常"),
/*
token 校验不通过
1.1.8 版本之前是非法用户
*/
INVAID_VIRTUAL_USER("940102","非法虚拟用户"),
/*
请求参数错误()
*/
INVAID_REQUEST("940103","请求方式错误"), /*
运行时异常()
*/
RUNTIME_EXCEPTION("950102","运行时异常"), GATE_EXCEPTION("940502","网关繁忙"),
CLIENT_ABORT("950504","请求超时"); private String code;
private String msg;
private Common(String code,String msg){
this.code=code;
this.msg=msg;
} public String getCode() {
return code;
} public String getMsg() {
return msg;
} public String getMsg(String code) {
return msg;
}
}
}
/**
* @author :cza
* @date :2020/11/25 15:56
* @description :
* @modyified By:
*/ import com.aiyusheng.framework.core.ResponseResult;
import com.aiyusheng.framework.core.enums.ReturnCode;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus; import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays; @ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); public static final String FINAL_MESSAGE="服务器内部错误,请联系系统管理员";
/**
* 功能描述:自定义后的异常处理
* @Param:
* @param ex
* @Return: com.aiyusheng.framework.core.ResponseResult
* @Author: chenzhian
* @Date: 2020/12/3 19:21
* @Description:
*/
@ExceptionHandler(value = BusinessException.class)
public ResponseResult BusinessExceptionHandle(BusinessException ex) {
ex.printStackTrace();
//记录日志
logger.error("\nBusinessExceptionHandle {}", getStackTrace(ex));
String code=ex.getCode();
String message=FINAL_MESSAGE;
if(ex.getMsgParams()!=null&&ex.getMsgParams().length>0){
message= Arrays.toString(ex.getMsgParams());
}
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!"); } /** 获取堆栈信息
* 功能描述:
* @Param:
* @param throwable
* @Return: java.lang.Throwable
* @Author: chenzhian
* @Date: 2020/12/3 19:25
* @Description:
*/
private String getStackTrace(Throwable throwable) {
StringWriter sw=new StringWriter();
PrintWriter pw=new PrintWriter(sw);
try {
throwable.printStackTrace(pw);
return sw.toString();
} finally {
pw.close();
}
} /**
* 功能描述: 统一拦截自定义异常
* @Param:
* @param ex
* @Return: com.aiyusheng.framework.core.ResponseResult
* @Author: chenzhian
* @Date: 2020/12/3 19:21
* @Description:
*/
@ExceptionHandler(value = Exception.class)
public ResponseResult exceptionHandle(Exception ex) {
//根据某个类型进行具体返回
/*
if(e instanceof BadRequestException){
return new ResponseResult(400, e.getMessage());
} if(e instanceof NoAuthorityException){
return new BaseResponse(401, e.getMessage());
} if(e instanceof FailureException){
return new BaseResponse(500, e.getMessage());
} else {//其他未捕获异常
LOGGER.error("exception:{}", e.getMessage(), e);}*/
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!"); } /**
* 拦截@RequestBody上validate失败后抛出的异常:MethodArgumentNotValidException
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) {
logger.error("exception:{}", e.getMessage());
return new ResponseResult(ReturnCode.Common.BUSINESS_PROCESS_FAILED, "服务器内部错误,请联系系统管理员!");
}
}
引用包
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.33</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
</dependencies>
java controller 异常捕获的更多相关文章
- java代码异常捕获throws抛出异常
总结:Throwable 是所以异常的父类.error和Exception是继承它的类 Exception: 这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环 ...
- java多线程异常捕获
java多线程中出现了异常,如何捕获.利用UncaughtExceptionHandler这个接口就可以了. 代码如下: package com.ming.thread.six.threadcreat ...
- java ThreadPoolExecutor 异常捕获
一,创建一个线程池 其中: public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) 饱和策略执行时的具体逻辑. p ...
- java 异常捕获小记
java 中异常捕获常用的为: try{ //业务代码 }catch(Exception e){ //异常捕获 }finally{ // 不管有无异常, 最后都会执行到这里 } 在方法体内如果想要把异 ...
- [javaSE] 异常捕获
异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} ...
- 有关于异常捕获点滴,plus我也揭揭java的短
▄︻┻┳═一『异常捕获系列』Agenda: ▄︻┻┳═一有关于异常捕获点滴,plus我也揭揭java的短 ▄︻┻┳═一根据异常自定义处理逻辑([附]java异常处理规范) ▄︻┻┳═一利用自定义异常来 ...
- JAVA并发,线程异常捕获
由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: package com.xt.thinks21_2; import java.util.concurrent.Exe ...
- java异常捕获的一点感悟
class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static v ...
- SpringBoot入门教程(十九)@ControllerAdvice+@ExceptionHandler全局捕获Controller异常
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...
随机推荐
- 【ACM程序设计】差分
差分 假设有一个数列,我们需要对数列中的一个区间加上或减去一个值,直接想到的便是对该区间进行一次循环逐项加减. 但是当请求的操作变得非常多的时候,每次请求都进行一次循环会很容易爆时间,因此我们引入了差 ...
- 利用腾讯云函数部署.Net 5米游社原神每日签到功能
自从GitHub批量禁止滥用Action功能后,项目不得不考虑另外方案执行应用.其中腾讯云函数被大家作为不错的选择(虽然马上也要收费了). 但对于.Net的部署目前资源很少,而且我也没学过bash.在 ...
- 【总结】2022GDOI普及组 没得游记
因为是线上,所以没得游记 Day -3 学校安排去7班上课,好耶! 上午全是主科,有一节生物 被你七班捧上天了 被你七班造谣说我暴踩Everyone,还传到九班,给我玩阴的是吧 下午模拟赛,初一第一 ...
- Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- 项目完成小结 - Django3.x版本 - 开发部署小结 (2)
前言 好久没更新博客了,最近依然是在做之前博客说的这个项目:项目完成 - 基于Django3.x版本 - 开发部署小结 这项目因为前期工作出了问题,需求没确定好,导致了现在要做很多麻烦的工作,搞得大家 ...
- 题解0012:剪花布条(KMP)
信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪 ...
- Linux下MySQL表名区分大小写
问题:MySQL一个数据库的表名统一小写,在Windows上安装的MySQL没有问题,但是把数据库部署到Linux上,应用启动的时候报表不存在错误. 解决:修改my.cnf lower_case_ta ...
- 第06组Alpha冲刺(3/6)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.鲍凌函 3.曾丽莉 4. 曹兰英 5. 方梓涵 6.董翔云 7.杜筱 8.黄少丹 9. 詹鑫冰 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- 2006NOIP普及组:明明的随机数
明明的随机数 时间限制:1000ms 内存限制:65536KB 题目描述: 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数 ...
- (C++)读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔)
1 /* 2 程序功能:读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔). 3 例如:当输入985这个数字时,显示如下信息: 4 985是一个3位数字! ...