@SneakyThrows注解是由lombok為我們封裝的,它可以為我們的代碼生成一個(gè)try...catch塊,并把異常向上拋出來课锌,而你之前的ex.getStackTrace()
是沒有這種能力的卧土,有時(shí),我們從底層拋出的異常需要被上層統(tǒng)一收集夷都,而又不想在底層new出一大堆業(yè)務(wù)相關(guān)的異常實(shí)例眷唉,這時(shí)使用@SneakyThrows可以簡(jiǎn)化我們的代碼。
@SneakyThrows為方法添加注解
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);
}
}
}
而這種方法冬阳,在上層被調(diào)用時(shí),它產(chǎn)生的異常是可以被向上傳遞的党饮,并且對(duì)它進(jìn)行業(yè)務(wù)上的封裝肝陪,產(chǎn)生業(yè)務(wù)相關(guān)的異常消息
throw new RepeatSubmitException(
String.format("記錄正被用戶%s鎖定,將在%s秒后釋放",
currentValue,
redisTemplate.getExpire(key)));
而在上層通過 @RestControllerAdvice
和ExceptionHandler
進(jìn)行統(tǒng)一的捕獲即可
@ExceptionHandler(RepeatSubmitException.class)
@ResponseStatus(HttpStatus.OK)
public CommonResult<String> handlerIllegalArgumentException(IllegalArgumentException e) {
String message = e.getMessage();
log.error(message);
return CommonResult.failure(400,message);
}
愿與諸君共進(jìn)步,大量的面試題及答案還有資深架構(gòu)師錄制的視頻錄像:有Spring刑顺,MyBatis氯窍,Netty源碼分析,高并發(fā)蹲堂、高性能狼讨、分布式、微服務(wù)架構(gòu)的原理柒竞,JVM性能優(yōu)化政供、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系,可以微信搜索539413949獲取朽基,最后祝大家都能拿到自己心儀的offer