为了在 Scala 中处理异常,我更喜欢避免基本的try/catch并从 Scalaz 的函数式思维中受益(在某些情况下Validation类似于类型)。Either
我的应用程序公开了一些服务。想象一下我的服务层中的这种方法(没有真正意义,但对概念有好处)。如果所有规则都成功通过,它将Buyer(购买者)与他的新关联Car并返回包含此关联:Car
def create(carDTO: CarDTO, buyerDTO: BuyerDTO): Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]
说明:创建 aCar可能会导致两种异常类型之一:
- Throwable包装异常的技术故障(例如,当数据库崩溃时) 。
- 业务失败(防止不一致的自定义应用程序规则,例如,Car具有非法状态)。CarCreationFailure是一个,当然可以通过更多的precised失败来扩展。
我的问题特别关注客户端,并专门处理不止一种潜力Business Failure。
是否应该将返回类型Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]替换为不那么繁琐的:ValidationNel[Throwable, CarDTO]
请注意此处ValidationNel(将错误/异常累积到 a 中NonEmptyList)。
缺点是新读者乍一看无法猜测此方法返回TechnicalFailure或CarCreationFailure(BusinessFailureso 的子类);只是一个太可怕了Throwable。
他将被迫对Throwable我的应用程序中包含的每种类型应用模式匹配,以确保不会忘记任何人... => 混乱。
这些解决方案中最干净的方法是什么,或者可能是……另一种?