0

クライアントで GWTP と RequestFactory を使用しています。

カスタムのUncaughtExceptionHandlerで Fatal Exception を処理したいと思います。カスタム ハンドラーを作成し、エントリ ポイント モジュールの configure() 呼び出しに登録しました。

public class ClientModule extends AbstractPresenterModule {
    @Override
    protected void configure() {

        // Register Uncaught Exception Handler first thing
        GWT.setUncaughtExceptionHandler( new CustomUncaughtExceptionHandler() );
...

ただし、クライアントで例外をスローすると

throw new RuntimeException("test");

例外はキャプチャされません。開発モードでは、キャッチされていない例外が開発コンソールまでずっと表示されます。さらにデバッグすると、GWT がカスタム ハンドラーを登録していないことがわかります。

handler = GWT.getUncaughtExceptionHandler();

戻り値

com.google.gwt.core.client.GWT$DefaultUncaughtExceptionHandler@370563b1

GWT.setUncaughtExceptionHandler が機能しない理由についてのアイデアはありますか?

記録として、私はcleancodematters によるこの投稿をフォローしました。彼の実装と私の実装の唯一の違いは、クライアントで GWTP (および GIN) を使用していることです。

4

3 に答える 3

1

メソッドをオーバーライドして有効な応答を取得できるため、onFailureメソッドは確実に呼び出されています。したがって、のデフォルトの実装を見てReceiver#onFailureください。

/**
 * Receives general failure notifications. The default implementation looks at
 * {@link ServerFailure#isFatal()}, and throws a runtime exception with the
 * failure object's error message if it is true.
 * 
 * @param error a {@link ServerFailure} instance
 */
public void onFailure(ServerFailure error) {
  if (error.isFatal()) {
    throw new RuntimeException(error.getMessage());
  }
}

あなたのテスト ケースでは、エラーは致命的なエラーとして受信されていますか? エラーが致命的とマークされていない場合、デフォルトの実装はまさにあなたが見ていることを行います...何もしません。

于 2013-10-15T19:03:09.847 に答える
1

ClientModuleGINを使用して設定する ことはできないと思いますUncaughtExceptionHandler。代わりに、カスタム PreBootstrapperを作成します。

PreBootstrapper を使用すると、GWTP ブートストラップ プロセスの直前にフックできます。
開始します。これは、GWTP の起動前に何かを行う必要がある場合に特に便利です。の
一般的に Bootstrapper の使用が推奨されますが、そうでない場合もあります
たとえば、gwt-log の UncaughtExceptionHandler を設定する場合などです。
<set-configuration-property name="gwtp.prebootstrapper"  
         value="com.arcbees.project.client.PreBootstrapperImpl"/> 

public class PreBootstrapperImpl implements PreBootstrapper {
    @Override
    public void onPreBootstrap() {
        GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            @Override
            public void onUncaughtException(final Throwable e) {
                Window.alert("There was a problem loading your application");
            }
        });
    }
} 
于 2013-10-16T14:21:48.880 に答える
0

コールバックで実行されるすべての JS コードは、キャッチされなかった例外が適切にルーティングされるように、呼び出しを $entry で GWT にラップする必要があります。それが起こらない場合は、GWTP のバグのように聞こえます (または RequestFactory の可能性がありますが、GWT の一部であるため可能性は低いと思われます)。

于 2013-10-16T00:37:32.297 に答える