Scala错误建模

时间:2016-09-17 16:44:17

标签: scala error-handling

在下列情况下,我正在考虑如何建模错误处理:

我有CommonErrors这是我所有方法可能出现的错误

我也有特定的错误,例如:Error1Error2Error3

所以我们最终有了

DoAErrors = CommonErrors + Error1 + Error2

DoBErrors = CommonErrors + Error2 + Error3

和方法签名:

doA() Either[DoAErrors, DoAResult]
doB() Either[DoBErrors, DoBResult]

为了好,我想使用密封特征,因此我的库的客户端可以安全地在DoAErrorsDoBErrors上进行模式匹配,并捕获常见的+细节错误。到目前为止,我尝试过:

sealed trait CommonErrors
… extends CommonErrors
… extends CommonErrors

sealed trait DoAErrors extends CommonErrors
Error1 extends DoAErrors

sealed trait DoBErrors extends CommonErrors

Error2 extends DoAErrors with DoBErrors
Error3 extends DoBErrors

问题来自于doA()doB()内部调用返回CommonError的方法,而CommonErrors无法改进DoA } DoB错误。如何塑造这种情况?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

根据您的说明,CommonErrors实际上是DoAErrorsDoBErrors的一种可能类型。换句话说 - 以下陈述是正确的:

  

CommonErrors是一个DoAErrors

     

CommonErrors是一个DoBErrors

这通常意味着CommonErrors应扩展其他类型,反之亦然。

确实 - 以下代码编译并允许对doAdoB的调用网站进行简单的模式匹配:

sealed trait DoAErrors
sealed trait DoBErrors
sealed trait CommonErrors extends DoAErrors with DoBErrors

class CommonE1 extends CommonErrors
class CommonE2 extends CommonErrors
class Error1 extends DoAErrors
class Error2 extends DoAErrors with DoBErrors
class Error3 extends DoBErrors

object Test {

  private def common(): Either[CommonErrors, String] = Left(new CommonE1())
  def doA(): Either[DoAErrors, String] = common()
  def doB(): Either[DoBErrors, String] = common()
}