Scala 方法抛出异常,而不是返回Try-in以进行理解

Scala 方法抛出异常,而不是返回Try-in以进行理解,scala,validation,for-loop,error-handling,try-catch,Scala,Validation,For Loop,Error Handling,Try Catch,请查找以下返回的示例源代码:- 网站主页,当身份验证服务不可用时 默认主页,当验证服务可用,但页面服务不可用时 不可用 错误页,当两个服务都不可用时 用户页,当所有服务都可用时 现在,第一个测试用例抛出下面的异常,但预期的结果是Try(WebsiteHomePage) 您的TryService存根正在抛出异常,而不是返回失败谢谢您的回答。但是我的第二个测试用例按预期工作。Try的map和flatMap将捕获异常并将其转化为失败。但是对服务.authenticate的调用不在映射或平面映射(想想理

请查找以下返回的示例源代码:-

网站主页,当身份验证服务不可用时

默认主页,当验证服务可用,但页面服务不可用时 不可用

错误页,当两个服务都不可用时

用户页,当所有服务都可用时

现在,第一个测试用例抛出下面的异常,但预期的结果是Try(WebsiteHomePage)


您的
TryService
存根正在抛出异常,而不是返回
失败

谢谢您的回答。但是我的第二个测试用例按预期工作。
Try的
map
flatMap
将捕获异常并将其转化为失败。但是对
服务.authenticate
的调用不在
映射
平面映射
(想想理解的代码是如何被翻译成
平面映射
映射
)中的,因此它抛出的任何异常都将传播到
用户主页
package tryeg

import scala.util._

/**
  * Created by mogli on 6/6/17.
  */
class TrySample(val service : TryService) {

  def homePageForUser(userId: String, secret: String): Try[Page] = {
    val tryhomepage = for {
      user     <- service.authenticate(userId, secret)
      homePage <- service.fetchHomePage(user)
    } yield homePage

    tryhomepage match {
      case Failure(e: ServiceUnavailableException) =>
        e.service match{
          case "AuthService" =>
            Try(WebsiteHomePage)
          case "PageService" =>
            Try(DefaultHomePage)
          case _ =>
            Try(ErrorPage)

        }

      case _ =>
        tryhomepage
    }
  }
}

case class User(id: Long)

case class Page(title: String, content: String)
object DefaultHomePage extends Page("Welcome!", "This is your amazing Homepage!")
object WebsiteHomePage extends Page("Welcome!", "This is your amazing website")
object ErrorPage extends Page("Sorry!", "Unhandled Erro")


sealed class MyException(msg: String) extends Exception(msg, null)
case class UnknownUserException(userId: Long) extends MyException(s"User with id [$userId] is unknown.")
case class WrongSecretException(userId: Long) extends MyException(s"User with id [$userId] provided the wrong secret.")
case class ServiceUnavailableException(service: String) extends MyException(s"The Service [$service] is currently unavailable")


trait TryService {
  def authenticate(userId: String, secret: String): Try[User]
  def fetchHomePage(user: User): Try[Page]
}
package tryeg

import org.junit.runner.RunWith
import org.scalamock.scalatest.MockFactory
import org.scalatest.FlatSpecLike
import org.scalatest.junit.JUnitRunner

import scala.util.Try


/**
  * Created by mogli on 6/6/17.
  */
@RunWith(classOf[JUnitRunner])
class TrySampleTest extends FlatSpecLike with MockFactory{

  val user = User(123)
  val tryuser = Try(user)
  val userpage = Page("jbaba", "jbaba ka page")
  val tryuserpage = Try(userpage)

  "non happy path with authentication service not available" should "return website page" in {
    val service = stub[TryService]
    ( service.authenticate(_, _) ).when("123", "secret") throws ServiceUnavailableException("AuthService")
    val trySample = new TrySample(service)
    val page = trySample.homePageForUser("123", "secret")
    //page should be (Try(WebsiteHomePage))
    println("non happy path for authentication service down ")
  }

  "non happy path with page service not available" should "return default home page" in {
    val service = stub[TryService]
    ( service.authenticate(_, _) ).when("123", "secret") returns (tryuser)
    ( service.fetchHomePage(_) ).when(user) throws ServiceUnavailableException("PageService")
    val trySample = new TrySample(service)
    val page = trySample.homePageForUser("123", "secret")
    //page should be (Try(DefaultHomePage))
    println("non happy path for page service down ")
  }

}
tryeg.ServiceUnavailableException: The Service [AuthService] is currently unavailable

    at tryeg.TrySampleTest$$anonfun$1.apply$mcV$sp(TrySampleTest.scala:31)
    at tryeg.TrySampleTest$$anonfun$1.apply(TrySampleTest.scala:29)
    at tryeg.TrySampleTest$$anonfun$1.apply(TrySampleTest.scala:29)