2017-03-23 6 views
2

Cyclops Reactの "Try with Resources"ブロックで、IOExceptionをカスタム例外タイプにマップしたいと思います。私はこれもJavaslangで試してみましたが、すべての例外を同じように扱うため、扱いにくいように見えます。「リソースを試してください」例外タイプをマップする方法は?

コード例:

private static Try<String, ConnectionError> readString() { 
    // Socket is a thread-local static field 
    final Try<String, IOException> string = Try.catchExceptions(IOException.class) 
      .init(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream()))) 
      .tryWithResources(BufferedReader::readLine); 

    return string.isSuccess() ? Try.success(string.get()) : 
      Try.failure(new ConnectionError("Could not read from server", string.failureGet())); 
} 

は、これは、よりエレガントな方法で行うことができますか?あるいは、何の意味もなく、Try<String, IOException>を返す方が良いでしょうか?

免責事項:私はCyclops Reactライブラリと一般的な関数型プログラミングを使用している初心者です。したがって、私は重大な概念の誤解があるかもしれません。 Javaslangを皮切り

答えて

4

は、次の操作を実行することが可能となります2.1.0:

Try<String> of = Try.withResources(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream()))) 
        .of(BufferedReader::readLine) 
        .mapFailure(
         Case(instanceOf(IOException.class), ConnectionError::new) 
        ); 

すなわち、 Try.withResources機能を追加しました。これで障害をマップできます。

mapFailureメソッドでは、さまざまなマッチケースが発生します。例外が一致しない(したがってマップされない)場合、元の例外が残ります。

Try署名の一部として例外タイプを含めることは意味がないと思います。 Try<String, IOException>、計算がいくつかの例外のうちの1つをスローする可能性があるためです。

コンパイラがジェネリックの上限を計算するときに型情報が失われるため、考えられる例外の種類を指定することも役に立ちません。

免責事項:私はあなたが障害のタイプを変換するために、「訪問」メソッドを使用することができますJavaslang

+0

ありがとうダニエル。現時点では、このバージョンがいつ利用可能になるのか考えていますか? –

+1

これは、次回の2.1.0-beta(4月の初め)でリリースされる予定です。現在、2.1.0を対象とした21の未解決の問題があります。少し時間がかかる5つの問題と、それを出荷できるまでに行わなければならないいくつかの下位互換性修正があります。要するに、私は5月を目標にしています(最終版)。 –

1

の生みの親です。すべてのサイクロプス反応型は、訪問方法または「異型性」を有する。これにより、そのデータ型の内部状態と照合することができます。 Tryの場合、2つの機能があります.1つはTryが成功であれば実行され、もう1つが失敗であれば実行されます。

private static Try<String, ConnectionError> readString() { 
    // Socket is a thread-local static field 
    return Try.catchExceptions(IOException.class) 
       .init(() -> new BufferedReader(new InputStreamReader(socket.get().getInputStream()))) 
       .tryWithResources(BufferedReader::readLine) 
       .visit(Try::success, 
        e->Try.failure(new ConnectionError("Could not read from server", e)); 
} 

Vavr/Javaslang Tryとcyclops-react Tryの間には大きな概念的な/デザインの違いがあります。異なるユースケースに適しています。 (ダニエルはVavr Tryの背後にある論理的根拠について概説することができます)。

cyclops-reactバージョンでは、明示的に名前が付けられたExceptionsのみが処理され、そのタイプ情報は保持されます。したがって、cyclops-react Tryは、成功型と最も一般的な推論型の2つの汎用パラメータをとります。

cyclops-react Tryは、実行中の流暢な操作(map/flatMapなど)で例外をキャッチしませんが、そのように設定することはできます。

サイクロプス・リアクションTryのコア設計目標は、バグを隠すのを避けることです。このStackExchange answerの詳細な概要があります。

関連する問題