2011-06-09 139 views
1

您是否看到有可能記錄服務器端異常?在服務器端
考慮這樣的代碼:java rmi服務器端異常處理

catch (Exception ex) { 
    throw new IllegalStateException (ex); 
} 

異常是由客戶端調用引起的。當然,客戶端會注意到異常。有沒有辦法以某種方式在服務器端處理它,沒有catch運行時異常?某種類型的處理程序會允許我記錄異常的堆棧跟蹤?

任何想法?

回答

0

通常,頂級服務器方法將有throws Exception

如果你用try-catch異常把這個方法中的「do it」代碼封裝起來,並且你仍然可以把它記錄下來。

public Response myServerTopLevelMethod() throws Exception { 
    try { 
     myImplCode(); 
    catch (Exception e) { 
     Log.error(e); 
     throw e; 
    } 
} 

現在你有一些關於怎麼做的選擇。基本方案是:

  1. 您只需重新拋出異常(如上)
  2. 可以發揮不錯,並返回一個「壞事發生了」迴應 - 就像許多Web服務器做

這裏的選項2的例子:

public Response myServerTopLevelMethod() throws Exception { 
    try { 
     myImplCode(); 
    catch (Exception e) { 
     Log.error(e); 
     return new Response("Yikes! Something exploded... we'll look into it."); 
    } 
} 

順便說一句,「日誌+拋」的選項1是你想這樣做的幾次之一;在頂級方法。在其他時間,你通常應該或者日誌扔,而不是兩個。

+0

我打算在沒有嘗試捕捉每個rmi方法的主體的情況下這樣做,但這似乎是記錄異常的最有效和最簡單的方法。謝謝。 – meliniak 2011-06-10 14:38:44

+0

-1。頂級服務器方法只能聲明爲拋出遠程接口中指定的異常。除非這些內容被同樣地定義,否則這個建議甚至不會編譯。 – EJP 2011-07-11 04:24:11

+0

我並不是說這是個好主意。我只是說這就是你通常需要處理的東西 - 你不能改變它,你只需要生活在一個需要你聲明'throws Exception'的接口中。這是我答案的前提。 – Bohemian 2011-07-11 05:32:12

1

您可以將服務器實例包裝在java.lang.reflect.Proxy中,並在代理中實現服務器端日誌記錄。只要確保代理被導出,而不是服務器實現。

+0

似乎是一個好主意,我會試試看。謝謝。 – meliniak 2011-06-10 10:12:29

1

有RMI系統屬性會自動爲您記錄服務器端異常。請參閱RMI主頁上的鏈接。

+0

我正在通過rmi在服務器上調用一個方法。我在這個方法中拋出了一個運行時異常,並且已經將_sun.rmi.server.exceptionTrace_和_java.rmi.server.logCalls_設置爲true,但是我沒有在服務器日誌中獲得任何堆棧跟蹤。任何想法爲什麼? – T3rm1 2012-08-21 15:22:10

+0

僅供參考,在Glassfish 3.1.2.2上爲我設置了'-Dsun.rmi.server.exceptionTrace = true'。我比較了之前和之後的行爲:在客戶端收到異常之前,但它沒有出現在服務器日誌中,在客戶端收到異常後_and_它出現在服務器日誌中。客戶端是調用EJB的「企業應用程序客戶端」。 EJB方法只是拋出一個'IllegalArgumentException'。 – DavidS 2015-08-10 18:31:29

+0

@DavidS你不明白你在這裏期待什麼。顧名思義,它追溯了例外。它對*例外沒有任何影響。 – EJP 2015-08-10 21:57:47