技术
java异常机制
最近在写java项目中又重新温习了一遍异常机制。以前写node的时候用的小伙伴写好的异常封装类,已经可以实现对任意异常的捕获,对任意异常的判断并统一返回状态值。但知其然,不知其所以然,用他人封装的代码是很舒服,但不了解其中的规则确是没有意义的。温故而知新。
借用网络的图片来看看java中的异常处理类型。

Throwable是所有异常和错误的超类,并让子类可以描述不同的异常情况。Throwable共有两个子类:Exception、Error,用于表明错误的情况。
Exception(异常)
异常类分为RuntimeException、非运行时异常,这里简单复习一下运行时异常的概念与java项目中的应用。
运行时异常代码是可以在程序中捕获的,能够被操作的,一般是由于程序猿写的时候业务逻辑引发的行为;常见的有空指针异常、下标越界异常等。这些异常在编译阶段是可以正常通过的,不进行检查,所以:人才是程序最大的BUG(狗头)。
运行时异常是可以进行捕获检查的,所以通常在写web项目时,项目会自定义自己的全局异常类用于捕获运行时异常信息,不展示系统级、业务级错误提供用户,而是能够自定义错误信息展示用户,保证用户体验。若依框架下的全局自定义异常处理大神写的非常不错,用于学习,基础代码如下:
首先先定义异常类型,若依微服务中在ruoyi-common-core模块下的exception定义了非常多的异常类型,有以下包括了file类型异常、用户异常、服务异常类等。

然后还需要写一个全局异常捕获类,用于捕获异常类型。若依全局异常类片段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| package com.sc.common.security.handler;
import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.sc.common.core.constant.HttpStatus; import com.sc.common.core.exception.DemoModeException; import com.sc.common.core.exception.InnerAuthException; import com.sc.common.core.exception.ServiceException; import com.sc.common.core.exception.auth.NotPermissionException; import com.sc.common.core.exception.auth.NotRoleException; import com.sc.common.core.utils.StringUtils; import com.sc.common.core.web.domain.AjaxResult;
@RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(NotPermissionException.class) public AjaxResult handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权"); }
@ExceptionHandler(NotRoleException.class) public AjaxResult handleNotRoleException(NotRoleException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权"); }
@ExceptionHandler(HttpRequestMethodNotSupportedException.class) public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); return AjaxResult.error(e.getMessage()); }
@ExceptionHandler(ServiceException.class) public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { log.error(e.getMessage(), e); Integer code = e.getCode(); return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); }
@ExceptionHandler(RuntimeException.class) public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); return AjaxResult.error(e.getMessage()); }
@ExceptionHandler(Exception.class) public AjaxResult handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生系统异常.", requestURI, e); return AjaxResult.error(e.getMessage()); }
@ExceptionHandler(BindException.class) public AjaxResult handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().get(0).getDefaultMessage(); return AjaxResult.error(message); }
@ExceptionHandler(MethodArgumentNotValidException.class) public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); return AjaxResult.error(message); }
@ExceptionHandler(InnerAuthException.class) public AjaxResult handleInnerAuthException(InnerAuthException e) { return AjaxResult.error(e.getMessage()); }
@ExceptionHandler(DemoModeException.class) public AjaxResult handleDemoModeException(DemoModeException e) { return AjaxResult.error("演示模式,不允许操作"); } }
|
在core定义的异常类型,可以添加到GlobalExceptionHandler全局异常类中,而注解:@RestControllerAdvice引用介绍
@RestControllerAdvice是什么
@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
————————————————
原文链接:https://blog.csdn.net/user2025/article/details/105458842
@RestControllAdvice注解与@ExceptionHandler配合使用时可以用于全局的异常处理。因为@RestControllAdvice注解将会作用到@ReuqestMapping上,相当于说所有的路由下的方法都会被我监控到,如果出现异常,会先寻找有无用户自定义的类型,若没有,则返回系统默认或对应的类型异常。所以在定义异常类时候,运行时异常的配置是默认需要的。
非运行时异常指的除了RuntimeException以外的异常,类型上都从属Exception类。非运行时异常指的从语法上或编译阶段无法通过的异常,是需要处理的,这种一般程序猿都能够及时的看到,毕竟你不改,你就run不起来。
ERROR(错误)
Error 类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
此类型错误一般不允许去实现任意Error类。这些错误不受检异常,当发现此类错误时,应用程序不应该去处理此类错误。
笔迹项目
前面几周已经陆续完成了前端基础界面的研发、后端数据库的设计,慢慢的逐步采用研发。需要考虑的太多,感觉还是应该先写出来,但不考虑细致点后面写的一多,容易不好改动,还是思虑多一些。
这个项目我还是想努力自己个人完成,慢慢写,想到什么写什么,总能够完成的,慢慢来、慢慢来~。晚上一个人在桌前慢慢设计的感觉很好,感兴趣的事情需要时间来沉淀,争取能够在年前出一个版本吧。笔迹项目的记录也该填补一点了。
好像没有什么其他可以讲的了。
生活
已经工作近二个月了,从实验室转变到公司、从学生转变到社会人。直观的感觉是在白天上班的忙碌后,剩下的时间留给自己的不多了,下班后的精力能够明显感觉到不是足够。在校学习的感觉是随心所欲的,有后路的,这里是没有的。
上周二起了个大早去拜访了MES项目的甲方,他们的人感觉有点怪怪的,不会好好说话,这作为一个程序猿不能忍的好不好。唠嗑了一个小时后,搭晗兄、王哥车回来,中途去洗车了,那个高压水枪减温利器。午后是去永辉附近一家——夫妻饭店吃了个饭。里面的菜抄的确实不错老实说,就是羊排太腻了。有没有一种可能是食堂饭菜太难吃了(dog)
中间的某个时刻我感觉时间流逝的很快,感觉一下子就到了周末,好像都是在改BUG中度过。食堂饭菜就那几种,然而小伙伴喜欢吃水饺,我真的要被吃吐了。我宁愿吃面条,我也不要吃水饺!
周六加班了一天,表示党的组织关系转真的很麻烦,需要很多证明,还是需要抽空回家一下,调个休。
结尾
不畏惧未来困难,我将在这流逝的时间中慢慢成长。