在下列情况下,我正在考虑如何建模错误处理:
我有CommonErrors
这是我所有方法可能出现的错误
我也有特定的错误,例如:Error1
,Error2
,Error3
所以我们最终有了
DoAErrors
= CommonErrors
+ Error1
+ Error2
DoBErrors
= CommonErrors
+ Error2
+ Error3
和方法签名:
doA() Either[DoAErrors, DoAResult]
doB() Either[DoBErrors, DoBResult]
为了好,我想使用密封特征,因此我的库的客户端可以安全地在DoAErrors
和DoBErrors
上进行模式匹配,并捕获常见的+细节错误。到目前为止,我尝试过:
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
错误。如何塑造这种情况?
感谢您的帮助!
答案 0 :(得分:1)
根据您的说明,CommonErrors
实际上是DoAErrors
和DoBErrors
的一种可能类型。换句话说 - 以下陈述是正确的:
CommonErrors是一个DoAErrors
CommonErrors是一个DoBErrors
这通常意味着CommonErrors
应扩展其他类型,反之亦然。
确实 - 以下代码编译并允许对doA
和doB
的调用网站进行简单的模式匹配:
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()
}