【问题标题】:(Scala) error handling(Scala) 错误处理
【发布时间】:2018-07-02 12:41:53
【问题描述】:

我目前正在制作一个返回对象的函数。但是如果我在输入中发现一些无效的东西,我想返回一些东西来表明这个问题。我只是无法解决这个问题..这里处理错误的正确方法是什么?使用选项?但是返回 None 并没有指定任何具体问题。我有什么问题吗?:)

case class myClass(value: Int)
def myFunction(input: Int) : myClass
{
  //return myClass if succeded
  //else return some error - what do I return here? 
}


//I've read that to handle some error scenarios you should do something like this:
sealed trait SomeError
object SomeError{
  case object UnknownValue extends SomeError
  case object SomeOtherError extends SomeError
  case object OutOfBounds extends SomeError
}
//But how do I return myClass and this at the same time in case of an error?

非常感谢!! ^^

【问题讨论】:

    标签: scala error-handling options


    【解决方案1】:

    是的,Option 无法向您提供有关您的错误的详细信息。为此,您可以使用更灵活的EitherEitherLeftRight 扩展。成功时返回Right,失败时返回Left(按照惯例)。

    例如

    sealed trait MyTrait
    case class MyClass(value: Int) extends MyTrait
    
    def myFunction(input: Int): Either[String, MyTrait] = {
      if (input >= 0) Right(MyClass(input)) else Left("input was negative")
    }
    

    或者使用SomeError

    def myFunction(input: Int): Either[SomeError, MyTrait] = {
      if (input >= 0) Right(MyClass(input)) else Left(OutOfBounds)
    }
    

    【讨论】:

    • 哦,好吧!因此,在这种情况下,使用 Either 应该使用“myClass”(左)和“SomeError”(右)吗? ^^
    • @JoeDortman No. Either 是右偏的,因此您应该使用 Right 获得“正确”结果,使用 Left 获得“改进建议”。
    • 谢谢!在这里帮了我很多! ^^
    猜你喜欢
    • 2015-12-28
    • 2015-01-26
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多