Scala with Futures中的错误处理

时间:2013-12-28 06:37:38

标签: scala error-handling future

以下方法使用future发送电子邮件,然后捕获mail.send可能抛出的任何异常:

sendEmail(from: String, recipients: Seq[String],
  subject: String, body: (Option[Txt], Option[Html])) = Try {

  import com.typesafe.plugin._
  import scala.concurrent.future
  import play.api.libs.concurrent.Execution.Implicits.defaultContext

  val mail = use[MailerPlugin].email

  mail.addFrom(from)
  recipients.map(mail.addRecipient(_))
  subject.map(mail.setSubject(subject)

  future {
    try {
      mail.send(body._1.map(_.body).getOrElse(""), body._2.map(_.body).getOrElse(""))
    } catch {
      case NonFatal(e) => Logger.warn("[%s] error sending email".format(ClassName, subject), e)
    }
  }
}

上述方法会返回SuccessFailure - 例如mail.addFrom如果发件人电子邮件无效,则可能会引发异常。话虽如此,我处理future块内可能出现的异常的方式是否正确?

1 个答案:

答案 0 :(得分:3)

try中您不需要future

val f = future {
  mail.send(body._1.map(_.body).getOrElse(""), body._2.map(_.body).getOrElse(""))
}

f.onFailure{
  case NonFatal(e) => Logger.warn("[%s] error sending email".format(ClassName, subject), e)
}

Future可能会在Try容器中包含成功的结果或失败。您可以使用Try方法获取onComplete,或使用recover方法将Failure转换为Success