【问题标题】:How do I propagate generic exceptions in RPC using Thrift?如何使用 Thrift 在 RPC 中传播通用异常?
【发布时间】:2016-11-16 15:11:18
【问题描述】:

我们必须使用 RPC,使用 Thrift 框架将异常从一个节点传播到另一个节点。我知道可以像这样在 Thrift 中声明异常:

exception SampleException {
    1: optional string cause
}

这会生成一个扩展通用 TException 的异常。

我想创建TExceptions,它的原因是另一个可能不会扩展TException 的异常,并在另一个节点中接收它。这可能吗?

如果不可能,那么最好传播不扩展 TException 的通用异常。如果我们可以传播RuntimeExceptions,则可以加分。

【问题讨论】:

  • 我不确定标题与内容的关系。 “正确的方式”是什么意思?内容本质上告诉我的恰恰相反:你显然对现状并不满意,所以这个问题也没有多大意义。介意澄清一下吗?
  • 感谢您的反馈!我会尽量让标题更清楚。

标签: java rpc thrift


【解决方案1】:

我想创建导致另一个异常的 TExceptions,并在另一个节点中接收它。这可能吗?

exception bar {
    1 : i32 nix
}

exception foo {
    1 : bar bar
}

这会生成一个扩展通用 TException 的异常。

是的,应该是这样。这并不是说TException 本身不能从RuntimeException 继承。

另外,如果 TExceptions 是 RuntimeExceptions,那就太好了

Thrift 是开源的。你可以拥有你想要的。 ;-) 还有this JIRA ticket

但它也需要是 TException。可以是通用的吗?

您必须使用 Thrift 支持的基本数据类型,以及使用 struct、union、map、set、list、exception 和 typedef 从它创建的任何复杂类型。如果您需要特殊行为,那么我建议您序列化数据并根据这些数据在客户端引发异常。在幕后 TException 的工作原理是一样的。如果您认为当前的行为可以改进,请在邮件列表中讨论和/或发送拉取请求。

【讨论】:

  • 这很好,但原因也需要是TException。可以是通用的吗?你知道这是否可能吗?
  • 您被绑定到 Thrift 支持的基本数据类型,以及使用structunionmap<>set<>list<>exception 从它创建的任何复杂类型和typedef。如果您需要特殊行为,那么我建议序列化数据和raise the exception at the client side based on those data。在幕后TException 工作方式相同。如果您认为当前的行为可以改进,请在邮件列表中讨论和/或发送拉取请求。
  • 如果它让你开心,我们开始吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2012-03-18
  • 2014-11-03
  • 2011-10-24
  • 2012-02-15
  • 2011-08-14
相关资源
最近更新 更多