6

アプリでグローバルな例外処理をオーバーライドしたいと考えていますRCP。キャッチされていない例外が発生するたびに、(ログを使用してjava) ログに記録し、アプリを終了します。クラスのeventLoopException(Throwable exception)メソッドは既に上書きしています。ApplicationWorkbenchAdvisorただし、これはイベント ループの例外のみをキャッチします。postStartup()今のところ、次のようにメソッドも上書きしました。

public void postStartup()
{
    Policy.setStatusHandler(new StatusHandler()
    {
       @Override
          public void show(IStatus status, String title)
          {
            LOGGER.log(Level.SEVERE, "Uncaught Exception", status.getException());
            UnexpectedErrorDialog();
            PlatformUI.getWorkbench().close();
          }
    });
}

ログファイルに例外を記録し、アプリを終了します。しかし、それは明らかに正しくなく、コンソールに例外が 2 回表示されgui dialogます。これは、ユーザーへの例外の表示をインターセプトすることだけです。では、グローバル例外処理を適切に上書き/変更して、デフォルトのコード (ログ) の代わりに使用するにはどうすればよいでしょうか?

4

2 に答える 2

2

sambi reddyのヒントのおかげで、ApplicationWorkbenchAdvisorクラスのAbstractStatusHandlerを上書きしました。

@Override
public synchronized AbstractStatusHandler getWorkbenchErrorHandler() {
    if (myStatusHandler == null) {
        myStatusHandler = new MyStatusHandler();
    }
    return myStatusHandler;
}

MyStatusHandlerはAbstractStatusHandlerを拡張し、次のようにhandleメソッドを上書きしました。

@Override
public void handle(StatusAdapter statusAdapter, int style)
{
    if(statusAdapter.getStatus().matches(IStatus.ERROR) && ((style != StatusManager.NONE)))
    {
            LOGGER.log(Level.SEVERE, "Uncaught Exception", statusAdapter.getStatus().getException());
            UnexpectedErrorDialog();
            PlatformUI.getWorkbench().close();
    }
}

正しく機能しているようですが、唯一の欠点は、コンソール出力が2つ残っていることです。

于 2012-11-07T17:38:33.010 に答える
2

org.eclipse.ui.statusHandlers拡張ポイントを使用することをお勧めします

于 2012-11-07T13:04:07.807 に答える