0

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

像这样:

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

但是,Thrift 编译器警告说没有定义 ioexception。

4

2 回答 2

3

每个 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>
    ...
}

因此,客户端与堆栈跟踪等一起获得完全异常。我们使用这种方法是几个项目,它肯定有效。

于 2012-08-01T18:36:28.967 回答
0

Thrift IDL 与语言无关。您不能使用内置异常(如本例中的 IOException)您可以定义和使用自己的“ioexception”

exception ioexception
{
 1:string msg,
}
于 2012-08-01T09:45:11.177 回答