0

ThriftIDLでIOExceptionなどのJava組み込み例外をスローしたいと思います。

このような:

service 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 に答える