繁体   English   中英

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 我的猜测是,这是因为存在一些语言,因为继承并不是语言的真正组成部分,因此实现起来过于复杂。

这使我想到的一个解决办法是把异常转换为结构,只有一个例外,节俭和union异常的数据转换成一个。 客户端捕获“常见”异常并重新引发该程序包中的异常。

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)
}

涉及很多工作,但可以解决。

上面有关于protobuf相关讨论 ,这可能也会有所帮助。

我找到了一个不错的解决方案。 尽管我不会说那没有任何技巧。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM