선택한 예외를 줄로 숨기기

Victor Rentea는 Java 챔피언이자 독립 트레이너로 깨끗한 코드, 디자인 모델과 유닛 테스트 등에 풍부한 경험을 가지고 있다.자세한 내용은 victorrentea.ro를 참조하십시오.
자바는 호출된 함수에 의해 버려진 개별 이상 유형을 호출자가 알 수 있도록 세계에서 유일하게 이상을 검사하는 프로그래밍 언어이다.
당신이 선택한 이상에 직면했을 때, 당신은 어떻게 할 것입니까?코드 전파를 통해 검사된 이상은 디테일을 누설할 수도 있고 화가 나거나 위험할 수도 있다.이것은 절대 다수의 상황에서 실행할 때 이상하게 다시 인용하는 것을 포착하고 현재의 용례를 소리 없이 중지시켜야 하는 이유입니다.
본고는 우리가 직장 생활에서 수십 번/수백 번의 코드를 작성한'신기한'방법을 소개했다.여기에 알림이 하나 있다.
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 주석 프로세서가 자바 컴파일러가 생성한 바이트 코드를 해독하도록 지시할 것입니다. catchthrows 또는 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은 이 언어를 효과적으로 해독하고 더 적고 집중적인 코드를 작성하도록 하고 있습니다.

언약 결론

  • 선택적으로 포착하지 않으려는 치명적인 이상을 럼백의 @Skillythrows로 처리합니다.
  • 그렇지 않으면 선택한 이상을 던진 실행 중 이상으로 포장합니다.
  • 면책 성명: 나는 전형적인 회복할 수 없는 이상을 지적하기 위해 특별히 날짜를 선택했다.새로운 Java8 LocalDate/LocalDateTime API를 사용해야 합니다. (놀랍습니다!)검사한 이상을 더 많이 던지지는 않지만, 실행 중 이상을 던집니다.

    좋은 웹페이지 즐겨찾기