【问题标题】:FlowException vs CordaRuntimeExceptionFlowException 与 CordaRuntimeException
【发布时间】:2019-03-03 14:03:40
【问题描述】:

在编写流程时,当我们不得不抛出异常时推荐什么?许多示例显示抛出 IllegalArgumentException 这是一个运行时异常。流的“调用”方法签名表明它抛出 FlowException 及其检查异常。当我们在休息层通过 RPCClient 进行通信时,我们会在抛出异常时得到以下行为

  1. 当像 FlowException 这样的 Checked Exception 时,在 RPCClient 端它会作为 UndeclaredThrowableException 抛出,而实际的异常是在 UndeclaredThrowableException 的 undeclaredThrowable 属性下找到的

  2. 当任何运行时异常被抛出时,我们确实会得到实际异常。

在休息层方面,我们确实希望可以识别异常,以便我们可以向 UI 层提供适当的 JSON 响应。在对 Corda 核心进行了一些挖掘之后,我们还发现还有 CordaRuntimeException 类,它是未经检查的异常,最好抛出这个异常而不是抛出通用的 IllegalArgumentException。但同时也需要根据需要抛出 FlowException。所以我的问题是在什么情况下我们需要抛出 FlowException vs unchecked runtime exception?

【问题讨论】:

    标签: corda


    【解决方案1】:

    假设一方正在运行一个流实例flowA:

    • 如果flowA 抛出FlowException,则流程结束并将异常传播到具有flowA 的活动流程会话的所有其他节点
    • 如果flowA 抛出任何其他类型的异常,则流程将结束,并且与flowA 进行活动流会话的每个其他节点都会收到通用UnexpectedFlowEndException

    因此,FlowException 仅应在您想要通知交易对手节点流量失败的原因时使用(例如,“我们不愿意以这种汇率将美元兑换成欧元。”)。否则,应该抛出另一种异常类型(例如,因为节点遇到内部数据库错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2015-12-10
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多