2012-10-15 74 views
0

我想發送一個在服務器端拋出的異常到客戶端。它工作的ATM部分。GWT客戶端異常更改

當我的DatabaseServerConnectionImpl中的某個方法失敗時,我保存該異常,然後客戶端檢測到(onFailure)該方法失敗並通過進一步的回調返回先前保存的異常。

此異常現在包含消息和堆棧跟蹤。該消息是正確的,但堆棧跟蹤是錯誤的。我在返回命令之前檢查了服務器端的堆棧跟蹤,這是正確的。例如:(服務器端):

org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2077) 

在客戶端異常後的樣子:

com.google.gwt.user.client.rpc.core.java.lang.Exception_FieldSerializer.instantiate(Exception_FieldSerializer.java:16) and it has a different length 

當我創造我剛纔設置的消息和堆棧跟蹤異常。 afaik例外是默認的序列化。服務器端的另一種方法沒有任何問題。 編輯:添加一些源代碼: DatabaseServerConnectionImpl的示例方法 lastexception是一個成員值! ...

try { 
     database.doStuff(obj); 
    } catch (SQLException e) { 
     Logger.getInstance().log(e); // Logs the Errors 
     lastException = new Exception(e.getMessage()); 
     StackTraceElement[] tmp = new StackTraceElement[e.getStackTrace().length]; 
     for (int i = 0; i < tmp.length; i++) { 
      tmp[i] = e.getStackTrace()[i]; 
     } 
     lastException.setStackTrace(tmp); 
     throw new IllegalArgumentException(); 
    } 

當異步回調客戶端上的失敗,我呼籲在服務器端下面的方法:

@覆蓋 公衆最終SerializableException getLatestException(){

 return lastException; 
    } 

我嘗試了上面的方法也嘗試和catch塊,但沒有例外被捕獲。

+0

你可以發佈一些非常簡短的示例代碼嗎? –

回答

0

異常說,你的rpc-dto的一個元素不能被序列化。

這可能是捕獲的異常。異常是一個無參數的構造函數嗎?如果不是,則不能序列化。

我認爲將完整的stcktrace發送到客戶端並不是一個好主意。是一個簡單的錯誤代碼不足以滿足您的用例?

+0

在某些情況下,在客戶端查看堆棧跟蹤非常有用,並且您並不總是必須打開日誌文件。 我解決了創建我自己的Exception類的問題。它實現Serializable並將stackTrace保存爲String Array,並將正常的錯誤代碼保存爲String。 – Akkusativobjekt

+0

這是我心中的第二個解決方案。 –