2012-08-01 60 views
0

我想在Thrift IDL中拋出一些java異常,如IOException。如何在Thrift IDL中使用java內置的異常

這樣的:

服務B {
         空隙removeLease()拋出(1:IOException異常e)所示,
}

然而,節儉編譯警告IOException的沒有按沒有定義。

+0

當客戶端連接不是用Java編寫的時候,它會變得很有趣。除了忽略它之外,他可以對有效載荷Java異常做些什麼?這會成爲一個阻礙嗎? – JensG 2013-04-24 00:43:47

回答

0

節儉IDL是語言agnostic.You不能使用內置的異常(比如IOException異常在這種情況下) 您可以定義和使用自己的「IOException異常」

exception ioexception 
{ 
1:string msg, 
} 
+0

我對這個「ioexception」還是很懷疑。因爲我爲這個「ioexception」生成了相關的java代碼,並且發現這個「ioexception」和java內建的IOException之間有一些區別。例如,IOException有比這個更多的構造函數,這是我擔心的,因爲可能會有使用這些缺少的構造函數的情況。謝謝! – shuxiong 2012-08-01 17:26:45

2

每一個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> 
    ... 
} 

因此,客戶端一起得到充分的例外與堆棧跟蹤等。我們使用這種方法是幾個項目,它肯定有效。

+0

您的Java服務器代碼至少對於Java 6來說是不正確的(可能它是Java 7,我不確定)。 – dmn 2013-03-01 20:59:31

+0

如果您想要仍然有一些非Java客戶端,這些客戶端無法反序列化異常而沒有額外的工作,那麼可以將它與至少在「SerializedException」中公開異常類名稱和/或消息結合使用。 – 2014-01-03 10:17:34