0

サーバー側でスローされた例外をクライアント側に送信したい。ATMは部分的に動作します。

私のメソッドDatabaseServerConnectionImplが失敗すると、例外を保存します。その後、クライアントはメソッドが失敗したことを検出し(onFailure)、以前に保存した例外をさらにコールバックして返します。

この例外には、メッセージとスタックトレースが含まれるようになりました。メッセージは正しいですが、スタックトレースが間違っています。returnコマンドの前にサーバー側のスタックトレースを確認しましたが、それは正しいものでした。例(サーバー側):

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

例外を作成するときは、メッセージとスタックトレースを設定するだけです。そして、例外はデフォルトでシリアル化されています。サーバー側のもう1つの方法は、問題なく機能しています。編集:いくつかのソースコードを追加します:DatabaseServerConnectionImplからのサンプルメソッド最後の例外はメンバー値です!..。

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();
    }

クライアント側で非同期コールバックが失敗した場合、サーバー側で次のメソッドを呼び出します。

@Override public final SerializableException getLatestException(){

     return  lastException; 
    }

上記の方法もtryandcatchブロックで試しましたが、例外はキャッチされませんでした。

4

1 に答える 1

0

例外は、rpc-dtoの1つの要素をシリアル化できなかったことを示しています。

これは、キャプチャされた例外である可能性があります。例外はパラメーターなしのコンストラクターですか?そうでない場合は、シリアル化できません。

完全なstcktraceをクライアントに送信するのは良い考えではないと思います。単純なエラーコードはあなたのユースケースには十分ではありませんか?

于 2012-10-15T17:19:39.783 に答える