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

时间:2015-04-21 11:09:47

标签: java thrift

是否有一种方法可以为Java生成的thrift异常类型添加类型层次结构信息。

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

我试过Facebook swift(Java - > Thrift转换),但看起来它无法与Apache thrift无缝协作。

2 个答案:

答案 0 :(得分:2)

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

我想到的一个解决方案是将异常转换为结构,只有一个Thrift异常和union异常数据。客户端抓住了#34;普通"异常并重新提出该包中的任何内容。

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 :(得分:0)

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

当我开始时,我只有两个选择:

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

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