3

我有客戶端 - 服務器系統。它們通過RMI進行通信,因此涉及序列化/反序列化。服務器在請求時向客戶端發送響應。如果發生異常,則在響應中設置。從另一個異常中初始化帶有堆棧跟蹤的異常?

但是,如果服務器發生一些異常,客戶端不知道它。所以我需要包裝原始的異常,但爲了調試目的而保留堆棧跟蹤。有更優雅的解決方案嗎?

//response from server to client 
class Response { 
    private MyException e; 

    public void set(MyException e) { 
     this.e = e; 
    } 
} 

//some other code 
catch (MyException e) { 
    response.set(e);  
} catch (Exception e) { 
    //could be exception which does not exist at client 
    //so I can not just set because it would cause ClassNotFoundException at client 
    response.set(new MyException(e.getMessage() + ": " + e.getStackTrace())); 
} 

似乎API只支持設置cause,我可以沒有問題的,因爲上述。我可以在不設置原因的情況下從另一個異常中設置堆棧跟蹤嗎?

+0

我會玩實現一個異常,這將填補從原因堆棧跟蹤,但刪除原因本身。 – agad

回答

1

你可能會考慮的方法setStackTrace(),例如:

Throwable originalException = ...; 
Throwable clientException = ...; 
clientException.setStackTrace(originalException.getStackTrace()); 

自己似乎只包含字符串的堆棧跟蹤元素,所以這不應該不知道特殊的服務器類的客戶端存在問題。