您是否看到有可能記錄服務器端異常?在服務器端
考慮這樣的代碼:java rmi服務器端異常處理
catch (Exception ex) {
throw new IllegalStateException (ex);
}
異常是由客戶端調用引起的。當然,客戶端會注意到異常。有沒有辦法以某種方式在服務器端處理它,沒有catch運行時異常?某種類型的處理程序會允許我記錄異常的堆棧跟蹤?
任何想法?
您是否看到有可能記錄服務器端異常?在服務器端
考慮這樣的代碼:java rmi服務器端異常處理
catch (Exception ex) {
throw new IllegalStateException (ex);
}
異常是由客戶端調用引起的。當然,客戶端會注意到異常。有沒有辦法以某種方式在服務器端處理它,沒有catch運行時異常?某種類型的處理程序會允許我記錄異常的堆棧跟蹤?
任何想法?
通常,頂級服務器方法將有throws Exception
。
如果你用try-catch異常把這個方法中的「do it」代碼封裝起來,並且你仍然可以把它記錄下來。
public Response myServerTopLevelMethod() throws Exception {
try {
myImplCode();
catch (Exception e) {
Log.error(e);
throw e;
}
}
現在你有一些關於怎麼做的選擇。基本方案是:
這裏的選項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是你想這樣做的幾次之一;在頂級方法。在其他時間,你通常應該或者日誌或扔,而不是兩個。
您可以將服務器實例包裝在java.lang.reflect.Proxy
中,並在代理中實現服務器端日誌記錄。只要確保代理被導出,而不是服務器實現。
似乎是一個好主意,我會試試看。謝謝。 – meliniak 2011-06-10 10:12:29
有RMI系統屬性會自動爲您記錄服務器端異常。請參閱RMI主頁上的鏈接。
我正在通過rmi在服務器上調用一個方法。我在這個方法中拋出了一個運行時異常,並且已經將_sun.rmi.server.exceptionTrace_和_java.rmi.server.logCalls_設置爲true,但是我沒有在服務器日誌中獲得任何堆棧跟蹤。任何想法爲什麼? – T3rm1 2012-08-21 15:22:10
僅供參考,在Glassfish 3.1.2.2上爲我設置了'-Dsun.rmi.server.exceptionTrace = true'。我比較了之前和之後的行爲:在客戶端收到異常之前,但它沒有出現在服務器日誌中,在客戶端收到異常後_and_它出現在服務器日誌中。客戶端是調用EJB的「企業應用程序客戶端」。 EJB方法只是拋出一個'IllegalArgumentException'。 – DavidS 2015-08-10 18:31:29
@DavidS你不明白你在這裏期待什麼。顧名思義,它追溯了例外。它對*例外沒有任何影響。 – EJP 2015-08-10 21:57:47
我打算在沒有嘗試捕捉每個rmi方法的主體的情況下這樣做,但這似乎是記錄異常的最有效和最簡單的方法。謝謝。 – meliniak 2011-06-10 14:38:44
-1。頂級服務器方法只能聲明爲拋出遠程接口中指定的異常。除非這些內容被同樣地定義,否則這個建議甚至不會編譯。 – EJP 2011-07-11 04:24:11
我並不是說這是個好主意。我只是說這就是你通常需要處理的東西 - 你不能改變它,你只需要生活在一個需要你聲明'throws Exception'的接口中。這是我答案的前提。 – Bohemian 2011-07-11 05:32:12