ThriftIDLでIOExceptionなどのJava組み込み例外をスローしたいと思います。
このような:
service B {
void removeLease()throws(1:ioexception e)、
}
ただし、Thriftコンパイラは、ioexceptionが定義されていないことを警告します。
ThriftIDLでIOExceptionなどのJava組み込み例外をスローしたいと思います。
このような:
service 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,
}