zoukankan      html  css  js  c++  java
  • 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("
    BusinessExceptionHandle {}", 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>
  • 相关阅读:
    系统调用(转)
    linux 特殊符号(转)
    对物权法第十二章建设用地使用权解读(转载)
    地籍管理信息化总体设计纲要
    行业管理架构初探
    基础框架平台——基础管理框架——GUI实现设计(一)
    通过类库来实现多窗体windows程序遇到了些问题,请大家有空帮忙看一下,谢谢
    基础框架平台——基础管理框架——GUI抽象设计(布局管理器)
    基础框架平台——基础管理框架——GUI抽象设计(工作台)
    当窗体最大化后,系统提示"集合在窗体变化时发生了修改",请问是什么缘故啊?
  • 原文地址:https://www.cnblogs.com/zhian/p/14082354.html
Copyright © 2011-2022 走看看