2017-11-07 36 views
1

スワロー次のハンドラ考えてみましょう:それは、このハンドラが実行されたときにどうするかはかなり明らかだ顧客と開発者の観点からハンドラは例外

public class CreateProjectHandler extends AbstractHandler { 

    @Override 
    public Object execute(ExecutionEvent event) throws ExecutionException { 
     // it does not matter what kind of exception this is: 
     throw new IllegalArgumentException("This is a test!"); 
    } 

} 

を:いくつかの種類のエラーメッセージがポップアップする必要があります。

何が起こるか:何もありません。

より正確:例外はエラーログ(およびEclipseから起動された場合はコンソール)に記録されます。しかし、ユーザーは何も見ませんが、実際にはエラーがあることさえ知りません。

これは、すべてのハンドラごとにExceptionを捕まえることで解決できますが、醜く煩わしいだけでなく、各スタイルガイドと矛盾します。

ハンドラで飲み込まれた例外を処理する良い方法はありますか?

答えて

1

Eclipse 4(e4または3.x互換モード)の場合は、IEventLoopAdvisorを実装するクラスをアプリケーションコンテキストに追加します。未処理の例外に対してeventLoopExceptionメソッドが呼び出されます。

E4のためにこれを設定するには適した場所は、RCPのライフ・サイクル・クラスの@PostContextCreateです:

@PostContextCreate 
public void postContextCreate(IEclipseContext context) 
{ 
    // Event loop advisor for error handling 

    context.set(IEventLoopAdvisor.class, new EventLoopAdvisor()); 

あなたはまたeventLoopIdleを実装する必要がありますが、display.sleep()を呼び出すことが非常に重要です。標準的な方法は、次のようになります。

@Override 
public void eventLoopIdle(final Display display) 
{ 
    display.sleep(); 
} 

3.xの互換モードの場合はポストコンテキストがワークベンチWorkbenchAdvisorにそのデリゲートを作成した後にインストールされたデフォルトのイベントループの顧問があります。 RCPで独自のアドバイザーを使用している場合は、アドバイザーのeventLoopExceptionメソッドをオーバーライドできます。 WorkbenchAdvisor#eventLoopException(Throwable)をオーバーライドする:

public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { 

    @Override 
    public void eventLoopException(Throwable exception) { 
     // do magic here 
    } 

    // [snipped other methods] 
} 
+0

私は、[このチュートリアル]を使用してみました(http://www.vogella.com/tutorials/Eclipse4LifeCycle/article.html –

+0

3.x互換モードでは、起動時に後で独自のイベントループアドバイザーをインストールして、「WorkbenchAdvisor」に委任しました。 –

0

は、私は私のE3の互換性アプリケーションのために働く別の方法を見つけました)に `LifeCycleManager`を追加します。 `@ PostContextCreate`が呼び出されますが、` IEventLoopAdvisor`のどちらのメソッドも呼び出されません。どういう考えがありますか?なぜですか?
関連する問題