簡體   English   中英

使用 Try 在 Scala 中處理錯誤的最佳實踐

[英]Best practices on error handling in Scala using Try

我處理異常如下:

def calculate(input: Option[Double]): Try[String] =
  Try {
    input match {
      case (Some(value)) => value.toString
      case (None) => throw new IllegalArgumentException("No value found")
    }
}

在客戶端代碼中:

val result = calculate(....)

result match {
    case Success(i) => println(i)
    case Failure(s) => throw s // or log(s) to log the issue and continue
}

對於干凈優雅的代碼庫,它是足夠好的實踐還是可以做得更好?

Try通常用於覆蓋可能引發錯誤的部分,例如在使用某些 Java 庫時可能引發異常的情況。 但是,如果您想返回可能的錯誤並強制客戶端處理它, Either[A, B]是更好的選擇,至少因為您可以為Left[A]指定更精確的錯誤類型並安全地與您的錯誤類型進行模式匹配A類型,而不是對某些Throwable進行可能不正確的模式匹配,就像您對Failure(t)所做的那樣。

因此,在您的情況下,可能的解決方案如下所示:

sealed trait CalculationError
case class Error1(cause: String) extends CalculationError

def calculate(input: Option[Double]): Either[CalculationError, String] =
    input match {
      case (Some(value)) => Right(value.toString)
      case (None) => Left(Error1("No value found"))
    }
}

val result = calculate(....)

result match {
    case Right(i) => println(i)
    case Left(Error1(s)) => println(s)
}

這是更安全的方法,因為您稍后可以添加另一種類型的錯誤,例如case class Error2(cause: String) extends CalculationError並且在客戶端模式匹配代碼部分,compile 將顯示一條警告消息,您錯過了新錯誤的處理: Match is not exhaustive Failure(t) compile 的情況下,將無法提示此類警告,因此在錯誤處理方面更容易出錯。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM