@SneakyThrows注解是由lombok为我们封装的,它可以为我们的代码生成一个try...catch块,并把异常向上抛出来,而你之前的ex.getStackTrace()是没有这种能力的,有时,我们从底层抛出的异常需要被上层统一收集,而又不想在底层new出一大堆业务相关的异常实例,这时使用@SneakyThrows可以简化我们的代码。
ex.getStackTrace()
import lombok.SneakyThrows; public class SneakyThrowsExample implements Runnable { @SneakyThrows(UnsupportedEncodingException.class) public String utf8ToString(byte[] bytes) { return new String(bytes, "UTF-8"); } @SneakyThrows public void run() { throw new Throwable(); } }
而它生成的代码为我们加上了try...cache块,并以新的Lombok.sneakyThrow的方式向上抛出
import lombok.Lombok; public class SneakyThrowsExample implements Runnable { public String utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } } public void run() { try { throw new Throwable(); } catch (Throwable t) { throw Lombok.sneakyThrow(t); } } }
而这种方法,在上层被调用时,它产生的异常是可以被向上传递的,并且对它进行业务上的封装,产生业务相关的异常消息
throw new RepeatSubmitException( String.format("记录正被用户%s锁定,将在%s秒后释放", currentValue, redisTemplate.getExpire(key)));
而在上层通过 @RestControllerAdvice和ExceptionHandler进行统一的捕获即可
@RestControllerAdvice
ExceptionHandler
@ExceptionHandler(RepeatSubmitException.class) @ResponseStatus(HttpStatus.OK) public CommonResult<String> handlerIllegalArgumentException(IllegalArgumentException e) { String message = e.getMessage(); log.error(message); return CommonResult.failure(400,message); }
原文链接:https://www.cnblogs.com/lori/p/13539999.html