【问题标题】:Exception type hierarchy in thrift / javathrift / java中的异常类型层次结构
【发布时间】:2015-06-28 12:19:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: java thrift


    【解决方案1】:

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

    我想到的一个解决方案是将异常转换为结构,只有一个 Thrift 异常和 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)
    }
    

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

    上面有一个related discussion about protobuf,可能也有帮助。

    【讨论】:

      【解决方案2】:

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

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

      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 版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        相关资源
        最近更新 更多