2016-05-10 4 views
3

Google Guava EventBusは例外を取り除き、ログに記録します。Google Guavaで例外を起動するEventBus

私は私のアプローチを説明するために非常に単純なアプリケーションを書いた:

public class SimplePrinterEvent { 
@Subscribe 
public void doPrint(String s) { 
    int a = 2/0; //This is to fire an exception 
    System.out.println("printing : " + s); 
    } 
} 

デモ

public class SimplePrinterEventDemo { 
    public static void main(String[] args) { 

    EventBus eventBus = new EventBus(); 
    eventBus.register(new SimplePrinterEvent()); 
    try{ 
     eventBus.post("This is going to print"); 
    } 
    catch(Exception e){ 
     System.out.println("Error Occured!"); 
    } 
    } 
} 

これはcatchブロックに来ることはありません!

私はSubscriberExceptionHandlerを追加し、handleException()をオーバーライドしました。

EventBus eventBus = new EventBus(new SubscriberExceptionHandler() { 

     @Override 
     public void handleException(Throwable exception, 
       SubscriberExceptionContext context) { 
      System.out.println("Handling Error..yes I can do something here.."); 
      throw new RuntimeException(exception); 
     } 
    }); 

ハンドラ内で例外を処理することができますが、私の要件は、例外をハンドリングするトップレイヤーに持ち込むことです。

EDIT:古いソリューション私はいくつかのウェブサイトに見つかりました。トリックに続き

public class CustomEventBus extends EventBus { 
@Override 
void dispatch(Object event, EventSubscriber wrapper) { 
    try { 
     wrapper.handleEvent(event); 
    } catch (InvocationTargetException cause) { 
     Throwables.propagate(Throwables.getRootCause(cause)); 
    } 
} 
} 

答えて

3

を(これは、グアバV18に取り組んでいることは)私には動作します:

最新EventBusクラスはあなたの拡張EventBusクラスでオーバーライドする必要がhandleSubscriberException()と呼ばれる方法があります。 (ここで私は持っています一つだけのバージョンに動作するソリューション、)

public class CustomEventBus extends EventBus { 
    //If version 18 or bellow 
    @Override 
    void dispatch(Object event, EventSubscriber wrapper) { 
    try { 
     wrapper.handleEvent(event); 
    } catch (InvocationTargetException cause) { 
     Throwables.propagate(Throwables.getRootCause(cause)); 
    } 
    } 
    //If version 19 
    @Override 
    public void handleSubscriberException(Throwable e, SubscriberExceptionContext context) { 
    Throwables.propagate(Throwables.getRootCause(e)); 
    } 
} 
+0

の両方が含まれてレベル18のために、以下のアプローチだけで動作しますが、あなたは、パッケージcom.google.common.eventbusにクラスCustomEventBusを置けば(EventSubscriberはパッケージPRIVAですte)。 –

関連する問題