封装自定义异常
程序员文章站
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()); } } } }