2

Vaadin フレームワークを使用して Web アプリケーション GUI を作成しています。

Vaadin ボタンがあり、そのクリック リスナー コードがアプリケーションのカスタム例外をスローする場合があります。アプリケーション コードの他のポイントでは、この例外はカスタム ウィンドウ クラスにスローされ、そこで集中的に処理されます。ここで似たようなことをしたいと思います。この例外を clickListener コードでスローして、ウィンドウ クラスのカスタム ターミナル エラー ハンドラでキャッチできるようにします。クリックリスナークラスは例外をスローしないため、そこで例外をスローすることはできず、例外をローカルで処理する必要があると思います。ボタン クリック リスナー レベルで例外を処理したくないので、カスタム ウィンドウ クラスに転送すると思います。このようなもの:

Button btnNew = new Button("New", new Button.ClickListener() {
  public void buttonClick(ClickEvent event) {
    try {
        doThingThatThrowsException();
    } catch (Exception exc) {
        window.handleCustomException()
    }
  }
});

これは、Vaadin を使用してカスタム例外の処理を集中化する通常の方法ですか?

4

1 に答える 1

1

それが例外を処理する通常の方法かどうかについてはお答えできませんが、非常によく似た処理を行います。

リスナーの数またはこれを行う頻度に応じて、委任を行う抽象リスナーを作成することもできます。

例えば

abstract class BasicListener {
  protected void handleThrowable(Component.Event event, Throwable throwable) {
    Window window = event.getComponent().getWindow();
    if (window instanceof ExceptionHandlingWindow) {
      ((ExceptionHandlingWindow) window).handleException(throwable);
    } else {
      // Log it ? DO something, anyway.
    }
  }
}

abstract class ExceptionHandlingButtonClickHandler extends BasicListener implements Button.ClickListener {
  @Override
  public void buttonClick(Button.ClickEvent event) {
    try {
      handleClick(event);
    } catch (Throwable e) {
      handleThrowable(event, e);
    }
  }

  protected abstract void handleClick(Button.ClickEvent event);
}

Button btnNew = new Button("New", new ExceptionHandlingButtonClickHandler() {
  @Override
  protected void handleClick(Button.ClickEvent event) {
    doThingThatThrowsException();
  }
});
于 2012-09-20T08:57:00.737 に答える