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,可能也会有帮助。
我找到了一个不错的解决方案。虽然我不会说那里没有黑客。
刚开始的时候,我只有两个选择:
-
先写Java代码,然后我就可以用FB生成IDL了
Swift,但我写的 java 类型不兼容
使用 Thrift,因为它们不包含 read() 和 write() 方法
Thrift 要求。
- 先写idl,我可以生成java类
从中。但它们不包含任何类型层次结构,而且,它们
将是可变的。我不喜欢可变对象。
我能够通过结合以上两个来解决这些问题。我首先编写了 java 异常,然后使用 swift 生成了 IDL。然后从 idl 生成另一个版本的 java 异常。我使用 modelmapper 在原始 java 类型和生成的 java 类型之间进行转换。我的服务核心使用第一个版本的异常和我的服务-thrift 层,使用 modelmapper 将它们转换为他们的 thrift 版本。
有没有办法将类型层次结构信息添加到为 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,可能也会有帮助。
我找到了一个不错的解决方案。虽然我不会说那里没有黑客。
刚开始的时候,我只有两个选择:
- 先写Java代码,然后我就可以用FB生成IDL了 Swift,但我写的 java 类型不兼容 使用 Thrift,因为它们不包含 read() 和 write() 方法 Thrift 要求。
- 先写idl,我可以生成java类 从中。但它们不包含任何类型层次结构,而且,它们 将是可变的。我不喜欢可变对象。
我能够通过结合以上两个来解决这些问题。我首先编写了 java 异常,然后使用 swift 生成了 IDL。然后从 idl 生成另一个版本的 java 异常。我使用 modelmapper 在原始 java 类型和生成的 java 类型之间进行转换。我的服务核心使用第一个版本的异常和我的服务-thrift 层,使用 modelmapper 将它们转换为他们的 thrift 版本。