在 Akka Stream - Scala 中抛出异常的最佳实践是什么?
What is the best practice for throwing exceptions inside an Akka Stream - Scala?
我是 Akka Stream 的新手,正在尝试找出处理流内意外行为的最佳实践。
我正在构建一个流,它使用 Account Kit API 将短期代码交换为长期访问令牌。
这里是构建流的相关代码:
override def ExchangeCode: Flow[String, AccessTokenInfo, NotUsed] =
Flow[String].mapAsync(1) { code =>
ws.url(buildUrl("access_token"))
.withQueryString(
"grant_type" -> "authorization_code",
"code" -> code,
"access_token" -> appToken
)
.withRequestTimeout(timeout)
.get
.map { response =>
if (response.status != 200) throw new RuntimeException("Unexpected response")
else response.json
}
.map { json =>
AccessTokenInfo("123456", 123, "123456")
}
}
我想知道如果状态代码不是 200 则抛出异常是否是处理它的正确方法,但据我所知,这是提前终止流的唯一方法。 (目前 return 值是一个虚拟值)
如果状态不是 200,为什么流终止是绝对必要的?通常你甚至想向下游发送故障,这样 Flow
的任何用户都可以得到通知并采取相应行动。
处理此类故障的典型方法是使用 Try
。稍微修改您的流程:
// Add Try Output
// |
// v
override def ExchangeCode: Flow[String, Try[AccessTokenInfo], _] =
Flow[String]
...
.map { response => response.status match {
case 200 => Try { response.json }
case _ => Try { throw new RuntimeException("Unexpected Response") }
}
}
.map( _ map (json => AccessTokenInfo("123456", 123, "123456")))
现在,如果可以检索或获取异常并能够处理失败情况,流的任何用户都可以获得有效的访问令牌。
备选方案Return类型:选项
如果只有 1 个异常只能由 1 个原因生成,那么 Option
也是可行的 return 类型:
override def ExchangeCode: Flow[String, Option[AccessTokenInfo], _] =
...
case 200 => Some(response.json)
case _ => None
...
我是 Akka Stream 的新手,正在尝试找出处理流内意外行为的最佳实践。
我正在构建一个流,它使用 Account Kit API 将短期代码交换为长期访问令牌。
这里是构建流的相关代码:
override def ExchangeCode: Flow[String, AccessTokenInfo, NotUsed] =
Flow[String].mapAsync(1) { code =>
ws.url(buildUrl("access_token"))
.withQueryString(
"grant_type" -> "authorization_code",
"code" -> code,
"access_token" -> appToken
)
.withRequestTimeout(timeout)
.get
.map { response =>
if (response.status != 200) throw new RuntimeException("Unexpected response")
else response.json
}
.map { json =>
AccessTokenInfo("123456", 123, "123456")
}
}
我想知道如果状态代码不是 200 则抛出异常是否是处理它的正确方法,但据我所知,这是提前终止流的唯一方法。 (目前 return 值是一个虚拟值)
如果状态不是 200,为什么流终止是绝对必要的?通常你甚至想向下游发送故障,这样 Flow
的任何用户都可以得到通知并采取相应行动。
处理此类故障的典型方法是使用 Try
。稍微修改您的流程:
// Add Try Output
// |
// v
override def ExchangeCode: Flow[String, Try[AccessTokenInfo], _] =
Flow[String]
...
.map { response => response.status match {
case 200 => Try { response.json }
case _ => Try { throw new RuntimeException("Unexpected Response") }
}
}
.map( _ map (json => AccessTokenInfo("123456", 123, "123456")))
现在,如果可以检索或获取异常并能够处理失败情况,流的任何用户都可以获得有效的访问令牌。
备选方案Return类型:选项
如果只有 1 个异常只能由 1 个原因生成,那么 Option
也是可行的 return 类型:
override def ExchangeCode: Flow[String, Option[AccessTokenInfo], _] =
...
case 200 => Some(response.json)
case _ => None
...