3

假设我为我的 Scala 应用程序定义了错误。我希望它们是Error,WarningOk. 我希望 ErrorandWarning包含人类可读的文本消息。

例如,我还想分配数字代码(0 - for Ok,1 - forWarning和 2 - for Error)以查找错误列表中最严重的错误。

因此,我将这个错误内容定义如下:

对象我的错误{  
  抽象密封案例类 MyError(code: Int, maybeMessage: Option[String])
  对象 Ok 扩展 MyError(0, None)
  最终案例类 Warning(message) extends MyError(1, Some(message))
  最终案例类 Error(message) 扩展 MyError(2, Some(message))
}

是否有意义?你将如何实施它?

4

3 回答 3

8

根据我的几个问题:

  1. 您不能扩展案例类。考虑sealed trait或简单abstract class
  2. 为什么它们都包含在MyErrors对象中?
  3. 你真的需要这个Int领域吗?您可以使用模式匹配进行过滤。
  4. 作为一个看起来语义错误Ok的实例。MyError我宁愿用Status
  5. 选择的问题,但我会为ErroneousStatus
  6. 在您设计设计之前,您是否考虑过EitherValidation作为替代方案?
于 2012-06-06T15:25:06.830 回答
2

这就是我认为你正在尝试做的事情:

object MyErrors extends Enumeration {
  val Ok = Value("ok", 0)
  val Warning = Value("warning", 1)
  val Error = Value("error", 2)

  class TypeVal(val name: String, val code: Int) extends Val(nextId, name)

  protected final def Value(name: String, code: Int) = new TypeVal(name, code)

  sealed case class MyError(error: TypeVal, maybeMessage: Option[String])

  def ok(msg: Option[String] = None) = new MyError(Ok, msg)
  def error(msg: Option[String] = None) = new MyError(Error, msg)
  def warning(msg: Option[String] = None) = new MyError(Warning, msg)

}

用于:

val e = MyErrors.error() 
// or
val f = MyErrors.ok(Option("Don't worry, be happy"))
f.error.code // Int = 0
f.maybeMessage // Option[String] = Some(Don't worry, be happy)

显然,它可以清理很多。但它应该让你继续前进。

于 2012-06-06T16:43:06.590 回答
2

Status根据 Nicolas将您的类型重命名为的建议,这里有一些其他细节的代码:

sealed trait Status {
  def code: Int
}
object Status {
  case object Ok extends Status {
    val code = 0
  }
  sealed trait WithMessage extends Status {
    def message: String
  }
  case class Warning (message: String) extends WithMessage {
    val code = 1
  }
  case class Error (message: String) extends WithMessage {
    val code = 2
  }
}

然后你可以像这样使用它:

scala> Status.Ok
res0: Status.Ok.type = Ok

scala> Status.Warning("blabla")
res1: Status.Warning = Warning(blabla)

scala> Status.Error("blabla").code
res2: Int = 2
于 2012-06-06T17:06:32.523 回答