Scalaでの例外とEither

13
Masahito IKUTA @cooldaemon

Scala が得意な方に質問。例外と Either どちらを使うべきなのでしょう? http://cooldaemon.tumblr.com/post/5383939918/scala-amqp-i-f #scala

2011-05-11 14:18:27
しいたけ @yuroyoro

@cooldaemon 俺の中ではEitherはJavaのチェック例外と同じ感覚で、利用側にExceptionの処理を適切に行わせたい場合に採用するものだと思ってます #scala

2011-05-11 14:21:47
🐶pomu0325 @pomu0325

@cooldaemon 検査例外的に異常の場合にLeftである型を返すのを明示したい場合にEither使ってます。Exceptionのサブクラス作らなくても好きな型を突っ込めるので場合によってはExceptionより短くかける時もありますね。

2011-05-11 14:23:04
Masahito IKUTA @cooldaemon

@yuroyoro なるほどー。追加で恐縮ですが、多分、allCatch だと非チェック例外も捕まえてしましますよね。connect の中で、allCatch しているのですが、try catch でチェック例外だけ Either にした方が良いでしょうか。

2011-05-11 14:32:16
Kenji Yoshida @xuwei_k

@cooldaemon @yuroyoro 設計方針によるのでしょうが、 色々なライブラリみててもあまりEither使っているの見ないですよね?

2011-05-11 14:37:56
Masahito IKUTA @cooldaemon

@pomu0325 チェック例外のみ Either で、非チェック例外は無視という事ですよね。Left に Exception や、そのサブクラスを包むのではなく、オリジナルのエラーを示すオブジェクトを包んだ際のメリットは、match が楽以外に何かありますでしょうか。

2011-05-11 14:39:54
Kenji Yoshida @xuwei_k

Either使うなら徹底的に使って、例外は使わないほうがよいくらいしか思いつかない(・ω・`)

2011-05-11 14:40:42
Kenji Yoshida @xuwei_k

今書いてるコード例外とEitherが混ざっちゃってるんだぜ(`・ω・´)

2011-05-11 14:41:54
しいたけ @yuroyoro

@cooldaemon scalaでは例外にチェック/非チェックの区別はありませんので、allCatchでは全部補足しますね。connectを呼び出す側に、必ず処理させたい失敗の種類ならEitherで明示的に渡し、無視する自由を与えたい種類の失敗は例外ですかね

2011-05-11 14:43:31
しいたけ @yuroyoro

Javaのチェック/非チェック例外も設計判断難しいが、Eithre/例外の判断も難しいな。

2011-05-11 14:44:02
しいたけ @yuroyoro

Eitherのメリットは、失敗の処理を実装しているかがコンパイル時に網羅的にチェックできる。デメリットは、かならず実装しなければならないし、呼び出した先から上位へ伝搬させたい場合に煩雑になる

2011-05-11 14:45:59
Masahito IKUTA @cooldaemon

@xuwei_k 何となく、Maybe は、例外をサポートしない言語が、例外をエミュレートするもの的な考えもあったので…。

2011-05-11 14:46:11
しいたけ @yuroyoro

例外(というかエラー情報)を返り値に含めるならEither、コンテキスト情報として必要に応じて処理できればよいなら例外、かな?

2011-05-11 14:47:45
Masahito IKUTA @cooldaemon

@yuroyoro ありがとうございます。スッキリしました。Java ライブラリのチェック例外を Either に変換。非チェック例外は無視で行きます。

2011-05-11 14:48:17
がくぞ @gakuzzzz

Eitherと例外の使い分けか。個人的には基本例外を使って、Contextを共有できないケース(バックグラウンドスレッドで発生した例外をイベントディスパッチスレッドで画面表示するとか)にEitherを使う、のがいいんじゃないかと思ってるがどうだろう #scala

2011-05-11 15:28:11