さまざまな種類のエラーをエレガントに処理するために、 。[結果]、IO [結果]、最後に使用する必要がある[エラー、結果]のいずれかを試してください
この質問は、どういうわけかScalaでのエラー処理について私がすでに持っていた多くの質問の要約です。あなたはここにいくつかの質問を見つけることができます。今のところ
- Throwing exceptions in Scala, what is the "official rule"
- Either, Options and for comprehensions
- Either monadic operations
を、私は次のことを理解して:
- どちらかのように使用することができます結果
- てみてください失敗する可能性があり、メソッド呼び出しのためのラッパーは、右の障害が致命的でない例外
- されているいずれかをbiaisedれるIO(scalaz)全3を簡単にしているIO操作
- を扱う純粋な方法を構築することができますすべての3が、彼らは我々が本当に例外の例外をスローする必要があります
- 致命的でない限り、私たちは通常、例外をスローしない官能langagesで
- 互換性がないためflatMap方法の理解のためで簡単に混合可能ではありません理解
- のために用いることのできます条件。私は、これはスロー可能オブジェクトは、JVMのパフォーマンスコストが作成
- を試してみてのアプローチであり、
今業務フローcontrole
リポジトリ層に使用されるものではないと思います私はUserRepository
を持っていると考えてください。 UserRepository
はユーザーを格納し、findById
メソッドを定義します。以下の障害が発生する可能性があります:
- を致命的な失敗(
OutOfMemoryError
) - アンIO障害データベースが読み取り/アクセスできないため
また、ユーザーはOption[User]
につながる、不足していることができ結果
リポジトリのJDBC実装を使用すると、SQLを使用して、致命的ではない例外(制約違反など)をスローすることができます。
私たちがIO操作を扱っているので、IOモナドは、純粋な機能が必要な場合にも意味があります。
だから、結果の型は次のようになります。それ以外の
Try[Option[User]]
IO[Option[User]]
- 何か?
サービス層
今度は、リポジトリの以前に定義されたfindById
を使用して、いくつかの方法updateUserName(id,newUserName)
を提供するビジネス層、UserService
を、ご紹介しましょう。
以下の障害が起こる可能性:サービス層に伝播
- すべてのリポジトリの障害を
- ビジネス・エラー:
- ビジネス・エラーが存在していないユーザーのユーザー名を更新することはできません。新しいユーザー名が短すぎる
そして、結果の型は次のようになります。
Try[Either[BusinessError,User]]
IO[Either[BusinessError,User]]
- 他の何か?
例外的なエラーではないため、BusinessErrorはThrowableではありません。
私はメソッド呼び出しを組み合わせることのために、内包表記を使用して維持したいため、内包
使用。
異なるモナドを簡単に混在させることはできませんので、すべての操作に一貫したリターンタイプを用意する必要があります。
現実世界のScalaアプリケーションでは、さまざまな種類のエラーが発生した場合にも補完機能を使い続けることができます。
今のところ、すべてがEither[Error,Result]
を返すサービスとリポジトリを使用して、分かり易いものが私のためにうまく動作しますが、すべての種類の失敗が一緒に溶けてしまい、これらの失敗を処理するためのハックになります。
for-comprehensionsを使用できるように、異なる種類のモナド間で暗黙的な変換を定義していますか?
エラーを処理するために独自のモナドを定義していますか?
ところで、私はすぐに非同期IOドライバを使用しています。 だから私は私の戻り値の型はさらに複雑になることができると思います:IO[Future[Either[BusinessError,User]]]
私のアプリケーションは空想ではないながら、私は本当に、使用するかわからないので、何かアドバイスは歓迎されるでしょう:それはどこ単なるAPIであります私は、クライアント側に表示できるビジネスエラーと技術的なエラーを区別することができます。私はエレガントで純粋な解決策を見つけようとします。
あなたはこれを書いたところでいくつかのコードを投稿してください。私は同じようなパターンを念頭に置いているので、とても興味があります。私のスカラズのスキルは、私が望むものではありません...私はこれらのクラスを理解するのに苦労しています。 – costa