[英]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.