Scala で例外を処理するために、私は基本的なtry
/catch
を避け、Scalaz の関数型の考え方(場合によっては型にValidation
似ています) の恩恵を受けることを好みます。Either
私のアプリケーションはいくつかのサービスを公開しています。私のサービスレイヤーでこの方法を想像してみてください(意味はありませんが、概念には適しています)。Buyer
(購入者) を新しいものに関連付け、すべてのルールが成功した場合、この関連付けを含むCar
を返します。Car
def create(carDTO: CarDTO, buyerDTO: BuyerDTO): Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]
説明: を作成するCar
と、両方の例外タイプのいずれかが発生する可能性があります:
- 技術的な障害(たとえば、データベースがクラッシュしたとき) のラッピング
Throwable
例外。 - ビジネスの失敗(たとえば、
Car
違法なステータスを持つなど、矛盾を防止するカスタム アプリケーションのルール)。もちろん、より多くの失敗CarCreationFailure
によって拡張される可能性があります。precised
私の質問は、特にクライアント側に焦点を当てており、具体的には複数の可能性を扱っていますBusiness Failure
。
戻り値の型Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]
を扱いにくいものに置き換える必要があります。ValidationNel[Throwable, CarDTO]
ここに注意してくださいValidationNel
(エラー/例外を に蓄積しますNonEmptyList
)。
欠点は、新しい読者が一見しただけでは、このメソッドがTechnicalFailure
or CarCreationFailure
( BusinessFailure
so のサブクラス) を返すと推測できないことです。あまりにも恐ろしいThrowable
。
Throwable
彼は、誰かを忘れないようにするために、私のアプリケーションに含まれるすべての型にパターン マッチングを適用することを余儀なくされるでしょう... => 面倒。
これらのソリューションの中で最もクリーンな方法は何ですか、それとも...他の方法ですか?