我想在Thrift IDL中抛出一些java内置异常,例如IOException。
像这样:服务B {
void removeLease()throws(1:ioexception e),
}
然而,Thrift编译器警告不会定义ioexception。
答案 0 :(得分:2)
每个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>
...
}
因此,客户端与stacktrace等一起获得完全异常。我们使用这种方法是几个项目,它确实有效。
答案 1 :(得分:0)
Thrift IDL与语言无关。您不能使用内置异常(在本例中为IOException) 您可以定义和使用自己的“ioexception”
exception ioexception
{
1:string msg,
}