私の新しい職場では、エラー処理に機能的な Java を多用しています ( http://www.functionaljava.org/javadoc/4.5/functionaljava/fj/data/Either.html )。
例外はほとんど使用されません。
これは、多くの理由で非常に厄介です。1 つを挙げると、次の行に進む前に、メソッド内のすべての API 呼び出し (Either を返す) は、最初に、返された Each がエラーかどうかを確認する必要があります。エラーの場合は、Either の形式でメソッド呼び出しのスタックに反映されます。スタック内の各メソッドは、エラーの処理を担当するメソッドにたどり着くまで、返されたエラーをチェックする必要もあります。これにより、非常に不適切な構造の Java コードが生成されます。すべてのAPI呼び出しで「停止」する必要があるため、通常のフローのJavaコードを実際に書くことはできません(ストリームは問題外です)。例えば
Either<Error, Value> myMethod(String someVar) {
Either<Error, Value> valEither someService.getSomething(someVar)
if (valEither.isRight()) {
Either<Error, Value> otherValue someService.getSomethingElse(valEither.right().value())
if (otherValue.isRight()) ..... //you get the idea
} else {
//maybe log
return valEither;
}
}
もちろん、Either のモナド メソッドを使用することもできますが (私はそうしています)、それでは、戻り値の型がエラーか値かを「尋ねる」必要があるという主要な問題は解決されません。エラー処理のインフラストラクチャとしてどちらかを使用するのは良い考えではないと思う理由は他にもたくさんあります (長い割り当てステートメント、長いメソッド、ネストされたジェネリックなど)。
それを回避するために、「エラー」を返すすべてのAPI呼び出しに対して特定の例外をスローし、現在取り組んでいるトップレベルのメソッドで例外を1回キャッチすることを考えました。
Value val = myService.getSomething().rightOrThrow(new MyException("blaa"));
しかし、同様のことを行うEitherプロジェクションタイプの唯一のメソッドはJavaエラーをスローしているため、それは可能ではないようです.メモリ不足エラー)。
myService.getSomething().right().valueE("some error msg");
提案や考えはありますか?
ありがとう