为了在 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
(BusinessFailure
so 的子类);只是一个太可怕了Throwable
。
他将被迫对Throwable
我的应用程序中包含的每种类型应用模式匹配,以确保不会忘记任何人... => 混乱。
这些解决方案中最干净的方法是什么,或者可能是……另一种?