如何在Thrift IDL中使用java内置异常

时间:2012-08-01 08:21:15

标签: thrift thrift-protocol

我想在Thrift IDL中抛出一些java内置异常,例如IOException。

像这样:

服务B {
void removeLease()throws(1:ioexception e),
}

然而,Thrift编译器警告不会定义ioexception。

2 个答案:

答案 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,
}