(Scala) error handling

北慕城南 提交于 2019-12-24 11:11:49

问题


I'm currently making a function that returns an object. But If i find something invalid in the input I want to return something to indicate that problem. I just can not wrap my head around on working this out.. What is the correct way to handle errors here? Using Options? But returning None does not specify any specific problems. Am i getting something wrong?:)

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?

Thank you so much!! ^^


回答1:


It's true, Option can't give you details about your error. For that you can use Either which is more flexible. Either is extended by Left and Right. On success, one returns a Right, on failure a Left (by convention).

e.g.

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")
}

Or using SomeError,

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


来源:https://stackoverflow.com/questions/51136514/scala-error-handling

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!