以下方法使用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)
}
}
}
上述方法会返回Success
或Failure
- 例如mail.addFrom
如果发件人电子邮件无效,则可能会引发异常。话虽如此,我处理future
块内可能出现的异常的方式是否正确?
答案 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
。