유창한 try-catch 블록 [닫힘]

Sep 23 2020

내 앱에이 유형 코드가 많이 있습니다.

String authUserId = null;

try {
  authUserId = webTokenService.readUserIdFromToken(app.getMasterKey(), authToken);
} catch (Exception e) {
  // do nothing
}

각 조각의 목표는 메서드가 throw되지 않으면 값을 할당하고 그렇지 않으면 null을 할당하는 것입니다. 위의 코드가 작동하지만 확실히 중복되고 단순화되지는 않습니다.

이 코드를 더 유창하게 만들 수있는 Java 라이브러리는 무엇입니까? 처럼:

String authUserId = Try<String>.of(try -> {
   return webTokenService.readUserIdFromToken(app.getMasterKey(), authToken);
});

또는 더 간단한 것.

최신 정보:

Vavr 라이브러리 사용

<dependency>
  <groupId>io.vavr</groupId>
  <artifactId>vavr</artifactId>
  <version>0.10.3</version>
</dependency>

이 문제를 다음과 같이 해결했습니다.

String authUserId = Try.of(() -> webTokenService.readUserIdFromToken(app.getMasterKey(), authToken)).get();

답변

1 flaxel Sep 23 2020 at 02:55

예외를 완전히 삼킨다면 이것은 실제로 최선의 방법 이 아닙니다 . Baeldung의 예외에 대한 멋진 기사 가 있습니다 .

위의 것을 예외 삼키기라고합니다. 대부분의 경우이 작업은 문제를 해결하지 못하고 다른 코드도 문제를 해결할 수 없도록하기 때문에 우리에게 약간의 의미가 있습니다.

이 동작을 구현 하는 라이브러리 를 찾았습니다 . 그러나 한동안 유지되지 않았습니다. 이런 이유로 나는 오히려 Vavr을 추천 합니다. 여전히 예외를 처리해야합니다. Baeldung 에서 추가 튜토리얼도 제공됩니다 . 문서에는 두 숫자를 나누는 작은 예가 있습니다.

int divide(int dividend, int divisor) {
    return dividend / divisor;
}

Try<Integer> divide(Integer dividend, Integer divisor) {
    return Try.of(() -> dividend / divisor);
}
2 rzwitserloot Sep 23 2020 at 03:22

조용히 예외를 삼키는 것이 멍청하다는 점을 감안할 때, 없습니다.

직접 작성하는 것은 아주 간단합니다.

class ShootMyselfInLegToolkit {
    @FunctionalInterface
    public interface PermissiveSupplier<T> {
        T supply() throws Exception;
    }

    public <T> T ohMyLegs(PermissiveSupplier<T> supplier) {
        try {
            return supplier.supply();
        } catch (Exception itHurts) {
            return null; // dear lord.
        }
    }
}

정말로 도서관에 넣고 싶다면 꼭.

약간 어리석은 기능 라이브러리는 다음과 같이 작동합니다. (허용-Java의 자체 jufSupplier는이를 수행 할 수 없음) 공급자 와 예외 처리기를 모두 제공하므로 다음과 같이 보입니다.

Tool.tryGet(() -> Files.readAllLines(Paths.get("foo.txt")), ioex -> { code to handle the exception });

그냥 갈 수는 없습니다. 대괄호가 없어서 저는 절대 엔터를 누르지 않습니다. 따라서 이것은 '코드 줄이 적다'고, 따라서 '단순하다'는 것입니다. 음, 매우 이상한 사고 방식입니다. 그곳에.

당신의 말에서 '유창하다'는 것은 무엇을 의미합니까? 이 용어가 setter, getter 및 builder 메서드에 적용된 것으로 알고 있으며 이는 "Get / set 접두사 없음"을 의미합니다. 그것은 분명히 여기에 적용되지 않으므로 분명히 다른 것을 의미한다고 생각합니다. Java lang 사양이 아니므로 아마도 정교 할 것입니다.

어리석은 스타일의 싸움을 제외하고,이 물건들이 어떻게 이해하기 더 쉽고 프로그래밍하기 더 쉬운 지 보지 못합니다. 나는 자바 커뮤니티에서 일반적으로 사용되는 스타일이 혐오감을 느끼기 때문에 미친 라이브러리 전체를 소개하는 데 대부분 동의 할 것이라고 생각 합니다. 비 관상적인 방식으로 코드를 작성하는 것은 언어와 공통된 스타일을 얼마나 싫어하든 상관없이 나쁜 생각입니다. 다른 언어를 사용하거나 스타일 취향을 조정하십시오. 말한 것보다 말이 더 쉽지만 그럼에도 불구하고 더 나은 아이디어는 훨씬 더 좋습니다.