我想在 Thrift IDL 中抛出一些 java 内置异常,例如 IOException。
像这样:
服务 B{
void removeLease() throws (1:ioexception e),
}
但是,Thrift 编译器警告说没有定义 ioexception。
我想在 Thrift IDL 中抛出一些 java 内置异常,例如 IOException。
像这样:
服务 B{
void removeLease() throws (1:ioexception e),
}
但是,Thrift 编译器警告说没有定义 ioexception。
每个 java 异常都是可序列化的,因此可以将其包装到 thrift 异常中。
节俭代码:
exception SerializedException
{
1: required binary payload
}
service MyService
{
int method(1: required string param) throws (1: SerializedException serializedException);
}
Java服务器代码:
class MyServiceImpl implements MyService.Iface {
int method(String param) throws SerializedException {
try {
...
} catch (IOException ex) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
new ObjectOutputStream(os).writeObject(ex);
throw new SerializedException(os.toByteArray());
}
}
}
Java客户端代码:
try {
int r = myService.method("param");
} catch (SerializedException ex) {
Exception nested = <Deserialize ex.payload via ByteArrayInputStream>
...
}
因此,客户端与堆栈跟踪等一起获得完全异常。我们使用这种方法是几个项目,它肯定有效。
Thrift IDL 与语言无关。您不能使用内置异常(如本例中的 IOException)您可以定义和使用自己的“ioexception”
exception ioexception
{
1:string msg,
}