Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
thrift/java中的异常类型层次结构_Java_Thrift - Fatal编程技术网

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

thrift/java中的异常类型层次结构,java,thrift,Java,Thrift,是否有一种方法可以将类型层次结构信息添加到为Java生成的thrift异常类型中 我想定义一些人们可以重用的常见异常集。通常情况下,客户机不是处理单个异常,而是希望处理一组异常。例如,假设java客户机希望捕获所有错误请求并打印异常消息。客户机不希望处理个别异常,如TooBigParamException、MissingParamException等,而是希望捕获这些异常的父级:BadRequestException。是否有方法更改TooBigParamException、MissingPara

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

我想定义一些人们可以重用的常见异常集。通常情况下,客户机不是处理单个异常,而是希望处理一组异常。例如,假设java客户机希望捕获所有错误请求并打印异常消息。客户机不希望处理个别异常,如TooBigParamException、MissingParamException等,而是希望捕获这些异常的父级:BadRequestException。是否有方法更改TooBigParamException、MissingParamException等的生成代码以添加扩展关系


我尝试了FacebookSwift(Java->Thrift转换),但它似乎无法与Apache Thrift无缝配合。

在当前状态下,Apache Thrift不支持继承,既不支持
struct
/
union
也不支持
异常
。我猜想这是因为有些语言的继承过于复杂而无法实现,因为它不是语言的一部分

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

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)
}
涉及到相当多的工作,但可能是一个解决方案


那边有一个,可能也会有帮助。

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

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

  • 首先编写Java代码,然后使用FB生成IDL Swift,但是我编写的java类型,将不兼容 使用Thrift,因为它们不包含read()和write()方法 节俭所需要的。
  • 首先编写idl,我可以生成java类 从它。但它们不包含任何类型层次结构,而且 将是可变的。我不喜欢可变对象。
  • 通过结合以上两种方法,我能够解决这些问题。我首先编写java异常,然后使用swift生成IDL。然后从idl生成另一个版本的java异常。我使用modelmapper在原始java类型和生成的java类型之间进行转换。我的服务核心使用第一个版本的异常和我的服务节约层,使用modelmapper将它们转换为节约版本