thrift 中的异常类型层次结构 / java

Exception type hierarchy in thrift / java

有没有办法将类型层次结构信息添加到为 Java 生成的节俭异常类型。

我想定义一些常见的异常集,人们可以重复使用。经常发生的情况是,客户不想处理单个异常,而是想处理一组异常。例如,假设 java 客户端想要捕获所有错误请求并打印异常消息。客户端不想处理单独的异常,如 TooBigParamException、MissingParamException 等,而是只想捕获这些异常的父类:BadRequestException。有没有办法改变TooBigParamException、MissingParamException等生成的代码来添加扩展关系?

我尝试了 Facebook swift(Java -> Thrift 转换),但它似乎无法与 Apache thrift 无缝协作。

在当前状态下,Apache Thrift 不支持继承,struct / union 也不支持 exception。我的猜测是,这是因为在某些语言中,继承太复杂而无法实现,因为它实际上并不是语言的一部分。

我想到的一个解决方案是将异常转换为结构,只有一个 Thrift 异常,union 将异常数据转换为该结构。客户端捕获 "common" 异常并重新引发该包中的任何内容。

struct OverflowError {
  1: double operator1
  2: double operator2
  3: string operation
}

struct DivByZeroError {
  1: double numerator
}

union AllTheErrors {
  1: OverflowError  over
  2: DivByZeroError  div0
  // more to come
}

exception MathError {
  1: AllTheErrors  theError
}


service ExceptionalCalculator {
  double Add(1: double arg1, 2: double arg2) throws (1: MathError mex)
  double Subtract(1: double arg1, 2: double arg2) throws (1: MathError mex)
  double Divide(1: double arg1, 2: double arg2) throws (1: MathError mex)
  double PriceOfDowJonesNextThursday() throws (1: MathError mex)
}

涉及大量工作,但可能是一个解决方案。

那边有一个related discussion about protobuf,可能也会有帮助。

我找到了一个不错的解决方案。虽然我不会说那里没有黑客。

刚开始的时候,我只有两个选择:

  1. 先写Java代码,然后我就可以用FB生成IDL了 Swift,但我写的 java 类型不兼容 使用 Thrift,因为它们不包含 read() 和 write() 方法 Thrift 要求。
  2. 先写idl,我可以生成java类 从中。但它们不包含任何类型层次结构,而且,它们 将是可变的。我不喜欢可变对象。

我能够通过结合以上两个来解决这些问题。我首先编写了 java 异常,然后使用 swift 生成了 IDL。然后从 idl 生成另一个版本的 java 异常。我使用 modelmapper 在原始 java 类型和生成的 java 类型之间进行转换。我的服务核心使用第一个版本的异常和我的服务-thrift 层,使用 modelmapper 将它们转换为他们的 thrift 版本。