第五课springboot实现全局异常处理

编程

这里写自定义目录标题

  • 简介
  • 项目的结构
  • 代码内容
    • 1.pom文件
    • 2.启动的main方法
    • 3. GlobalExceptionHandler
    • 4. BusinessException
    • 5. PropertiesResource
    • 6. ExceptionController

简介

项目中经常会碰到各种各样的异常处理,如果在项目各个地方都通过
try{
}catch{
}
就会觉得代码很凌乱,而且我们需要对代码中的异常进行包装;不能吧对应的异常信息直接返回给上游.
正常的操作使用统一的异常处理内容;
同时根据异常码给定指定的异常信息内容; 通常我们可以配置在对于的properties文件中;或者存放到指定的redis缓存中去;对于从缓存中获取比较简单结合项目直接使用;
本案例是通过读取本地properties文件中的code->msg来处理的;
项目demo下载

项目的结构

代码内容

1.pom文件

2.启动的main方法

springboot 项目的启动入口类

@SpringBootApplication

publicclassMainApplication{

publicstaticvoidmain(String[] args)throws Exception {

SpringApplication.run(MainApplication.class, args);

}

}

3. GlobalExceptionHandler

全局的异常处理类,在当前类里面定义各种exception类的处理方式;
案例中我们自定义的 BusinessException 里面通过异常code 来获取对于的msg

@RestController

@ControllerAdvice

publicclassGlobalExceptionHandler{

privatestaticfinal SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");

privatestaticfinal String ASSERT_ERROR_CODE ="10000";

privatestaticfinal String SYSTEM_ERROR_CODE ="20000";

@ExceptionHandler(value = BusinessException.class)

@ResponseBody

public Object businessException(HttpServletRequest req, Exception e)throws Exception {

boolean instance = BusinessException.class.isInstance(e);

if(instance){

BusinessException bex =(BusinessException) e;

JSONObject json =newJSONObject();

json.put("retCode", bex.getErrorCode());

json.put("retMsg", bex.getErrorMsg());

json.put("path", req.getRequestURI());

json.put("timestamp", sdf.format(newDate()));

return json;

}

return"---BusinessException Handler---:"+ e.getMessage();

}

@ExceptionHandler(value = IllegalArgumentException.class)

@ResponseBody

public Object testException(HttpServletRequest req, Exception e)throws Exception {

boolean instance = IllegalArgumentException.class.isInstance(e);

if(instance){

IllegalArgumentException bex =(IllegalArgumentException) e;

JSONObject json =newJSONObject();

json.put("retCode", ASSERT_ERROR_CODE);//标识统一的断言的异常信息

json.put("retMsg", PropertiesResource.getMessage(ASSERT_ERROR_CODE));

json.put("retDesc", bex.getMessage());

json.put("path", req.getRequestURI());

json.put("timestamp", sdf.format(newDate()));

return json;

}

return"---IllegalArgumentException Handler---:"+ e.getMessage();

}

@ExceptionHandler(value = Exception.class)

@ResponseBody

public Object exception(HttpServletRequest req, Exception e)throws Exception {

JSONObject json =newJSONObject();

json.put("retCode", SYSTEM_ERROR_CODE);//标识统一的断言的异常信息

json.put("retMsg", PropertiesResource.getMessage(SYSTEM_ERROR_CODE));

json.put("retDesc", e.getMessage());

json.put("path", req.getRequestURI());

json.put("timestamp", sdf.format(newDate()));

return json;

}

4. BusinessException

我们自定义的exception类, 里面新增errorCode 和errorMsg字段
当我们往外抛出异常的时间指定对于的errorCode 然后在当前方法里面设置
errorMsg 主要是通过 PropertiesResource 来实现的内容;

publicclassBusinessExceptionextendsRuntimeException{

privatestaticfinallong serialVersionUID =1L;

private String errorCode;

private String errorMsg;

publicBusinessException(String exceptionCode){

this.errorCode = exceptionCode;

this.errorMsg = PropertiesResource.getMessage(exceptionCode);

}

publicBusinessException(String exceptionCode,String errorMsg){

this.errorCode = exceptionCode;

this.errorMsg = errorMsg;

}

publicBusinessException(String exceptionCode, String errorMsg, Throwable cause){

super(cause);

this.errorCode = exceptionCode;

this.errorMsg = errorMsg;

}

// ..get/set 省略..

}

5. PropertiesResource

当前类似一个工具类吧properties文件中的异常码对于的 异常信息给加载进来
static 代码块中指定需要加载的properties文件的地址;

publicclassPropertiesResource{

privatestatic ReloadableResourceBundleMessageSource i18nMessage ;

publicPropertiesResource(){

}

publicstatic String getMessage(String messageKey, Object[] messageArgs){

String message = null;

try{

message = i18nMessage.getMessage(messageKey, messageArgs, LocaleContextHolder.getLocale());

}catch(MissingResourceException var4){

message ="i18nMessage is: "+ messageKey +", can"t get the I18n properties";

}catch(Throwable var5){

message ="i18nMessage is: "+ messageKey +", can"t get the I18n properties";

}

return message;

}

publicstatic String getMessage(String messageKey){

returngetMessage(messageKey,(Object[])null);

}

static{

i18nMessage =newReloadableResourceBundleMessageSource();

//读取message.properties文件内容

i18nMessage.setBasenames(newString[]{"config/message","classpath:message"});

}

}

6. ExceptionController

访问的入口类内容;
通过访问
http://localhost:8080/exception/test 测试统一的断言异常
http://localhost:8080/exception/test?flag=3000 测试业务异常内容
http://localhost:8080/exception/test?flag=20000 测试系统异常内容
观察不同的异常的处理内容

@RestController

@RequestMapping("/exception")

publicclassExceptionController{

privatestaticfinal Logger khy = LoggerFactory.getLogger("KHY");

@RequestMapping("/test")

public String login(String flag)throws Exception{

Assert.notNull(flag,"flag不能为空");

if(flag.equals("30000")){

thrownewBusinessException("30000");

}elseif(flag.equals("30001")){

thrownewBusinessException("30001");

}elseif(flag.equals("30002")){

thrownewBusinessException("30002");

}elseif(flag.equals("20000")){

thrownewException("测试系统异常");

}

return"执行成功";

}

}

访问对于的链接的效果图
1.

2.

3.
这么就完成了一个简单的全局异常处理的内容;

以上是 第五课springboot实现全局异常处理 的全部内容, 来源链接: utcz.com/z/518085.html

回到顶部