Javaの例外をScalaで扱う

タイトルのことを調べようとしていて、三ヶ月に同じことを調べていたのでブログにメモしておきます…。主に↓に書いてある内容以上のことはありません。前より早く理解できたり、理解が深まったりしたので、進捗していると思いたい。

Scalaの場合

Scalaの関数の場合、以下のケースが多いと思います。

  • 値が存在しない場合もあるときはOption[A]を返す
    • 例: DBから値を引いてきたけど、存在しないときはNoneを返す
  • 失敗するかもしれない処理で、失敗した場合は理由も返して欲しいときはEither[A, B]を返す
    • 例: 外部との通信で破壊的な処理が失敗するかもしれないので、Left("Could not delete user")を返す
    • TrySuccessFailureというパターンもできる

SomeRightになっているもの同士の演算は取り出してくるんで…と手で丁寧にやっていると疲れるし読むのも大変です。mapflatMapforを組み合わせると書くのも楽になるし、読むのも楽になります。Haskellの本で勉強した。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

どれを使うにしてもパターンマッチでかちっとできるのは書いてても読んでても安心できますね(特にsealed traitなどを使っている場合)。

Javaの場合

ScalaのプロジェクトでもJavaのライブラリを使うことはよくよくあると思いますが、Javaの場合は失敗するかもしれない処理でもOptionEitherを返さず例外を吐くことが多いです。以下のように、一旦OptionEitherでくるむとScalaの場合と同じように扱うことができてよさそうですね。

  • allCatch opt => 例外吐いたときはNoneにして、成功した場合はSomeでくるんで返してくれる
  • allCatch either => 例外を吐いたときはLeftにして、成功した場合はRightでくるんで返してくれる

参考