선택한 예외를 줄로 숨기기
4136 단어 javalombokcleancodeexceptions
자바는 호출된 함수에 의해 버려진 개별 이상 유형을 호출자가 알 수 있도록 세계에서 유일하게 이상을 검사하는 프로그래밍 언어이다.
당신이 선택한 이상에 직면했을 때, 당신은 어떻게 할 것입니까?코드 전파를 통해 검사된 이상은 디테일을 누설할 수도 있고 화가 나거나 위험할 수도 있다.이것은 절대 다수의 상황에서 실행할 때 이상하게 다시 인용하는 것을 포착하고 현재의 용례를 소리 없이 중지시켜야 하는 이유입니다.
본고는 우리가 직장 생활에서 수십 번/수백 번의 코드를 작성한'신기한'방법을 소개했다.여기에 알림이 하나 있다.
public static Date parseDate(String dateStr) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e); // this :(
}
}
이 catch rethrow를 수동으로 실행하지 않으려면, 다음은 @SneakyThrows
의 마법 영역에서 나온 주석입니다.이 방법으로 방법을 설명하고
catch
자구를 간단하게 삭제합시다.@SneakyThrows
public static Date parseDate(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.parse(dateStr);
}
이렇게 하면 Lombok 주석 프로세서가 자바 컴파일러가 생성한 바이트 코드를 해독하도록 지시할 것입니다. catch
에 throws
또는 ParseException
자구가 없지만.Warning: the Java IDE you use must be hacked (see here how).
Lombok이 컴파일할 때 코드를 변경할 수 있다는 것을 알면, 사람들은 우리 함수의 현재 주체가
try { ... } catch (Exception e) { throw new RuntimeException(e); }
이것은 합리적인 기대다.실제로 checked 이상은 삼키지 않고 던져지는 함수다.그러나 자바 8 이후 롬백은 약간 엉뚱한 방식으로 이를 실현했다.진정한 기능을 이해하려면
.class
파일을 역컴파일합니다.public static Date parseDate(String dateStr) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.parse(dateStr);
} catch (Throwable var6) {
throw var6;
}
}
확실히, Lombok은 내 함수체 주위에try-catch 블록을 추가했지만, 그것을 포획Throwable
하고 포장이 전혀 없는 상황에서 다시 촉발했다.뭔가 이상해!
Throwable
함수의 throws
자구에 성명해야 합니다!복사한 경우 코드를 에 붙여넣습니다.java 파일, 이 코드를 컴파일할 수 없음을 곧 발견할 수 있습니다!!그런데 처음에 어떻게 번역했어?!
어떻게 가능한 일인지 이해하기 위해서, 검사 이상과 실행 중 이상 사이의 차이는 자바 컴파일러 (자바 c) 에서만 강제로 실행된다는 것을 알아야 합니다.자바가 실행될 때 (JVM) 어떤 이상을 던지든 상관없습니다. 자바는 같은 방식으로 모든 이상을 호출 창고에 전파합니다.따라서 Lombok 프로세서는 자바를 속여 바이트 코드를 생성하는데 이 바이트 코드는 실제로 컴파일할 수 없는 코드를 나타낸다.
당황하다
Project Lombok
하지만 1분 동안 냉정해지면 이상한 생각이 든다. 검사한 이상이 무형으로 던져진다면 앞으로 어떻게 그것을 포착할 수 있겠는가?우리 한번 해 봅시다.
try {
parseDate("2020-01-01");
} catch (ParseException e) {...}
그러나 try
블록의 어떤 내용도 던지지 않기 때문ParseException
.javac는 이런 방법을 거절할 것입니다.직접 보기: 그렇다면 이것은 무엇을 의미하는가?이는 사용
@SneakyThrows
으로 숨겨진 이상을 다시 단독으로 포획해서는 안 된다는 뜻이다.반대로, 보이지 않는 검사 이상을 포착하기 위해 창고의 어느 위치에 일반catch (Exception)
을 설정해야 한다.예를 들어, catch (RuntimeException)
를 사용하여 Spring REST 끝점 예외를 처리하는 경우 선언을 처리해야 합니다@RestControllerAdvice
.더 많은 세부 사항은 곧 다가올 기자회견에서 발표될 것이다.너희들 중 일부는 이것에 대해 혐오감을 느낄 수도 있다.다른 사람들은 매우 흥분할 것이다.나는 평가하러 온 것이 아니라, 단지 내가 훈련하거나 상담한 수백 개의 프로젝트에서 광범위하게 전파된 기술을 보고하러 온 것이다.부주의하면 오용될 수 있으니 이 기능을 책임감 있게 사용해야 하는지 판단해 주십시오.
그래, 그래...근데 왜?!
자바는 오래된 언어이기 때문이다.25년은 짐을 휴대하는 데 아주 긴 시간이었다.그래서 오늘 Lombok은 이 언어를 효과적으로 해독하고 더 적고 집중적인 코드를 작성하도록 하고 있습니다.
언약 결론
Reference
이 문제에 관하여(선택한 예외를 줄로 숨기기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/victorrentea/hide-checked-exceptions-with-sneakythrows-i3h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)