scala - 共享错误和密封特征的函数

标签 scala error-handling

我正在为kadmin命令实现一个库。除其他外,采用以下方法:

def changePassword(principal: String, newPassword: String): Either[ErrorCase, Boolean]
def deletePrincipal(principal: String): Either[ErrorCase, Boolean]

这两个操作可能返回错误,因此它们的返回类型为Either[ErrorCase, Boolean]。其中ErrorCase定义为:
trait ErrorCase
case object InsufficientPermissions extends ErrorCase
case object PrincipalDoesNotExist extends ErrorCase
case object IncorrectPassword extends ErrorCase
case object PasswordTooShort extends ErrorCase
case object PasswordWithoutEnoughCharacterClasses extends ErrorCase
case object PasswordIsBeingReused extends ErrorCase
case object PasswordExpired extends ErrorCase
case object UnknownError extends ErrorCase

我的问题是:如果我将特征ErrorCase定义为密封特征,那么当他/她调用API方法之一时,我将给API用户增加检查所有可能的ErrorCase的负担。这对于changePassword方法是有意义的,因为所有这些错误情况都可能在此操作中发生。但是对于deletePrincipal方法,这是没有意义的,因为与密码相关的所有错误情况将永远不会发生。换句话说,API方法共享错误情况,但是每种方法不一定使用每种错误情况。

如何使特征密封,但以某种方式指定在每种方法中仅使用某些ErrorCases。

最佳答案

Any problem in computer science can be solved with another level of indirection, except the problem of too many levels of indirection.


sealed trait ErrorCase
sealed trait PasswordErrors extends ErrorCase
sealed trait OtherErrors extends ErrorCase

case object IncorrectPassword extends PasswordErrors
case object PasswordTooShort extends PasswordErrors
case object PasswordWithoutEnoughCharacterClasses extends PasswordErrors
case object PasswordIsBeingReused extends PasswordErrors
case object PasswordExpired extends PasswordErrors

case object InsufficientPermissions extends OtherErrors
case object PrincipalDoesNotExist extends OtherErrors
case object UnknownError extends OtherErrors

不确定处理UnknownError(OtherErrors的子类,直接ErrorCase的子类或其他方法)的最佳方法是什么,但这取决于您自己决定。

关于scala - 共享错误和密封特征的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943229/

相关文章:

java - 使用spark-cassandra-connector时出错: java. lang.NoSuchMethodError

java - 将以下内容从 Java 转换为 Scala 时,为什么会收到 "will always yield true"警告?

swift - 如何在通过 Firebase (Swift) 创建用户之前检查电子邮件是否已被使用以及电子邮件格式是否错误

SQL 数据截断 : Incorrect date value

C:从后台线程返回异步错误的模式?

scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?

java - 像 Scala 这样的 Java 中的三重引号

scala - Spark : coalesce very slow even the output data is very small

javascript - NodeJs 捕获异步方法中发生的未处理错误

python - 永远运行python脚本,无需担心错误