我想在Thrift IDL中拋出一些java異常,如IOException。如何在Thrift IDL中使用java內置的異常
這樣的:
服務B {
空隙removeLease()拋出(1:IOException異常e)所示,
}
然而,節儉編譯警告IOException的沒有按沒有定義。
我想在Thrift IDL中拋出一些java異常,如IOException。如何在Thrift IDL中使用java內置的異常
這樣的:
服務B {
空隙removeLease()拋出(1:IOException異常e)所示,
}
然而,節儉編譯警告IOException的沒有按沒有定義。
節儉IDL是語言agnostic.You不能使用內置的異常(比如IOException異常在這種情況下) 您可以定義和使用自己的「IOException異常」
exception ioexception
{
1:string msg,
}
我對這個「ioexception」還是很懷疑。因爲我爲這個「ioexception」生成了相關的java代碼,並且發現這個「ioexception」和java內建的IOException之間有一些區別。例如,IOException有比這個更多的構造函數,這是我擔心的,因爲可能會有使用這些缺少的構造函數的情況。謝謝! – shuxiong 2012-08-01 17:26:45
每一個Java的例外是序列化的,所以它的可能把它包裝成節儉的例外。
節儉代碼:
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>
...
}
因此,客戶端一起得到充分的例外與堆棧跟蹤等。我們使用這種方法是幾個項目,它肯定有效。
您的Java服務器代碼至少對於Java 6來說是不正確的(可能它是Java 7,我不確定)。 – dmn 2013-03-01 20:59:31
如果您想要仍然有一些非Java客戶端,這些客戶端無法反序列化異常而沒有額外的工作,那麼可以將它與至少在「SerializedException」中公開異常類名稱和/或消息結合使用。 – 2014-01-03 10:17:34
當客戶端連接不是用Java編寫的時候,它會變得很有趣。除了忽略它之外,他可以對有效載荷Java異常做些什麼?這會成爲一個阻礙嗎? – JensG 2013-04-24 00:43:47