欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

封装自定义异常

程序员文章站 2022-04-04 15:26:10
才开通博客没几天,不知道写什么东西,就把最近在项目中做的东西分享一下,开通博客也可以监督一下自己,技术的路很遥远,希望能通过写博客来让自己走的更远。 一般在web项目中都需要定义一个全局异常来处理一些业务方面的异常,下面是自定义异常的一些代码。 1.自定义一个异常,然后继承RuntimeExcept ......
  • 才开通博客没几天,不知道写什么东西,就把最近在项目中做的东西分享一下,开通博客也可以监督一下自己,技术的路很遥远,希望能通过写博客来让自己走的更远。

  • 一般在web项目中都需要定义一个全局异常来处理一些业务方面的异常,下面是自定义异常的一些代码。

1.自定义一个异常,然后继承runtimeexception

/**
 * @author zhuwenwen
 * @date 2018/8/16 20:18
 */
@getter
public class customexception extends runtimeexception {
    /**
     * 异常编码
     */
    private integer code;

    /**
     * 附加数据
     */
    private object data;

    public customexception(string errormsg) {

        super(errormsg);
        this.code= customenum.error.getcode();
    }

    public customexception(string errormsg, integer code) {
        super(errormsg);
        this.code = code;
    }

    public customexception(integer code, string errormsg, throwable errorcourse) {
        super(errormsg,errorcourse);
        this.code = code;
    }

    public customexception(string message, integer code, object data) {
        super(message);
        this.code = code;
        this.data = data;
    }

}

2.定义一个全局异常处理的类

/**
 * 处理全局异常
 *
 * @author zhuwenwen
 * @date 2018/8/17 9:31
 */
@restcontrolleradvice
public class customexceptionhandler extends responseentityexceptionhandler implements customexceptionhanlertrit {


    private logger logger=loggerfactory.getlogger(customexceptionhandler.class);
    /**
     *
     * @see responseentityexceptionhandler#handleexceptioninternal
     */
    @override
    protected responseentity<object> handleexceptioninternal(exception ex, object body, httpheaders headers, httpstatus status,webrequest webrequest) {
        logger.warn("{}", ex.getmessage());

        return handleexception(customenum.failure_http.getcode() + status.value(), ex.getmessage(), null);
    }

    /**
     * 处理servletexception
     *
     * @param ex      异常
     * @return        异常处理结果
     */
    @exceptionhandler(value = {servletexception.class})
    protected final responseentity<object> handleservletexception(servletexception ex) {
        logger.error("{}", ex);

        return handleexception(customenum.failure_servlet.getcode(), ex.getmessage(), null);
    }

    /**
     * 处理sqlexception
     *
     * @param ex      异常
     * @return        异常处理结果
     */
    @exceptionhandler(value = {sqlexception.class})
    protected final responseentity<object> handlesqlexception(sqlexception ex) {
        logger.error("{}", ex);

        return handleexception(customenum.failure_db.getcode(), ex.getmessage(), null);
    }

    /**
     * 处理constraintviolationexception
     *
     * @param ex      异常
     * @return        异常处理结果
     */
    @exceptionhandler(value = {constraintviolationexception.class})
    protected final responseentity<object> handleconstraintviolationexception(constraintviolationexception ex) {
        logger.error("{}", ex);

        string message = ex.getmessage();
        if (ex.getconstraintviolations() != null && !ex.getconstraintviolations().isempty()) {
            message = ex.getconstraintviolations().stream().findfirst().ispresent()
                    ? ex.getconstraintviolations().stream().findfirst().get().getmessage() : null;
        }

        return handleexception(customenum.failure_validation.getcode(), message, null);
    }

    /**
     * 处理morphedexception
     *
     * @param ex      异常
     * @return        异常处理结果
     */
    @exceptionhandler(value = {customexception.class})
    protected final responseentity<object> handlemorphedexception(customexception ex) {
        logger.info("{}", ex);

        return handleexception(ex.getcode(), ex.getmessage(),ex.getdata());
    }

    /**
     * 处理runtimeexception
     *
     * @param ex      异常
     * @return        异常处理结果
     */
    @exceptionhandler(value = {runtimeexception.class})
    protected final responseentity<object> handleruntimeexception(runtimeexception ex) {
        logger.error("{}", ex);

        return handleexception(customenum.failure_unknown.getcode(), ex.getmessage(), null);
    }

}

3.封装成一个组件,可以打成jar包,供多个项目使用,那么可以自定义一个注解,然后在启动类上加上这个注解,即可使用。下面是一个简单的demo

/**
 * @author zhuwenwen
 * @date 2018/8/17 11:02
 */

@target(elementtype.type)
@retention(retentionpolicy.runtime)
@import(customexceptionhandler.class)
@documented
public @interface enablecustomexception {
    /**
     * 是否开启
     * @return
     */
    boolean enabled() default true;


}
/**
 * @author zhuwenwen
 * @date 2018/8/17 14:47
 */
public class customimportbeandefination implements importbeandefinitionregistrar {
    @override
    public void registerbeandefinitions(annotationmetadata annotationmetadata, beandefinitionregistry beandefinitionregistry) {
        //是否含有@enablecustomexception注解
        if (annotationmetadata.isannotated(enablecustomexception.class.getname())){
            //获取该注解上面的所有属性,然后封装成一个map
            multivaluemap<string, object> attributes = annotationmetadata.getallannotationattributes(enablecustomexception.class.getname());
            if(attributes.get(enablecustomexceptioncode.enabled).equals(boolean.true)){
                beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.rootbeandefinition(customexceptionhandler.class);
                beandefinitionregistry.registerbeandefinition(customexceptionhandler.class.getname(),beandefinitionbuilder.getbeandefinition());
            }
        }
    }
}