2016-09-17 82 views
0

我有停留在如何将错误处理在以下情况下进行建模我的脑海:斯卡拉误差建模

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

我也有具体的错误错误,如:Error1Error2Error3

所以我们必须在最后

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,它是不可能在DoA也不DoB错误改装CommonErrors的方法。如何模拟这种情况?

感谢您的帮助!

回答

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() 
} 
+0

嗯其实很有道理,我会尽量让你知道。本来我只有CommonErrors,所以当我添加ErrorA和B时,我试图用现有的错误来组合。非常感谢 ! –

+0

它似乎工作正常!谢谢 ! –