我使用guava的EventBus,不幸的是它捕獲並記錄了事件處理程序拋出RuntimeException時發生的InvocationTargetException。我可以禁用此行爲嗎?Guava EventBus:不捕獲RuntimeException
8
A
回答
8
因爲它的立場,這是一個深思熟慮的決定,並在EventBus文檔討論:
處理程序不應該在一般情況下,拋出。如果他們這樣做,EventBus將捕獲並記錄異常。這很少是錯誤處理的正確解決方案,不應該依賴;它的目的僅僅是爲了幫助在開發過程中發現問題。
替代方案是being considered,雖然我很懷疑他們會使其進入12版
4
這裏是懶惰
public class Events
{
public static EventBus createWithExceptionDispatch()
{
final EventBus bus;
MySubscriberExceptionHandler exceptionHandler = new MySubscriberExceptionHandler();
bus = new EventBus(exceptionHandler);
exceptionHandler.setBus(bus);
return bus;
}
private static class MySubscriberExceptionHandler implements SubscriberExceptionHandler
{
@Setter
EventBus bus;
@Override
public void handleException(Throwable exception, SubscriberExceptionContext context)
{
ExceptionEvent event = new ExceptionEvent(exception, context);
bus.post(event);
}
}
}
代碼現在,您可以訂閱ExceptionEvent
。
這是我ExceptionEvent
只是複製粘貼&
@Data
@Accessors(chain = true)
public class ExceptionEvent
{
private final Throwable exception;
private final SubscriberExceptionContext context;
private final Object extra;
public ExceptionEvent(Throwable exception)
{
this(exception, null);
}
public ExceptionEvent(Throwable exception, Object extra)
{
this(exception,null,extra);
}
public ExceptionEvent(Throwable exception, SubscriberExceptionContext context)
{
this(exception,context,null);
}
public ExceptionEvent(Throwable exception, SubscriberExceptionContext context, Object extra)
{
this.exception = exception;
this.context = context;
this.extra = extra;
}
}
0
只是繼承番石榴EventBus,寫你自己的自定義eventbus。 提示:此類應寫入com.google.common.eventbus包中,以便可以覆蓋內部方法。
package com.google.common.eventbus;
import com.google.common.util.concurrent.MoreExecutors;
public class CustomEventBus extends EventBus {
/**
* Creates a new EventBus with the given {@code identifier}.
*
* @param identifier a brief name for this bus, for logging purposes. Should be a valid Java
* identifier.
*/
public CustomEventBus(String identifier) {
super(
identifier,
MoreExecutors.directExecutor(),
Dispatcher.perThreadDispatchQueue(),
LoggingHandler.INSTANCE);
}
/**
* Creates a new EventBus with the given {@link SubscriberExceptionHandler}.
*
* @param exceptionHandler Handler for subscriber exceptions.
* @since 16.0
*/
public CustomEventBus(SubscriberExceptionHandler exceptionHandler) {
super(
"default",
MoreExecutors.directExecutor(),
Dispatcher.perThreadDispatchQueue(),
exceptionHandler);
}
@Override
void handleSubscriberException(Throwable e, SubscriberExceptionContext context) {
throw new EventHandleException(e);
}
}
相關問題
- 1. Guava EventBus調度
- 2. Guava EventBus單元測試
- 3. 回滾捕獲的RuntimeException
- 4. 爲什麼不捕獲異常catch runtimeException?
- 5. 從Guava EventBus訂戶中拋出異常
- 6. 引發Google Guava EventBus中的例外
- 7. 有條件的訂閱與Guava EventBus
- 8. Guava java EventBus實例化錯誤
- 9. 谷歌guava singleton Eventbus多次觸發
- 10. Google Guava Eventbus和Swing Modal對話框
- 11. 爲什麼Guava EventBus不能實現接口?
- 12. 什麼時候可以捕獲RuntimeException
- 13. 何時收集Google Guava EventBus對象垃圾?
- 14. Guava eventBus在註銷時報告「丟失事件處理程序」
- 15. 與Guava的EventBus一樣工作的消息傳遞服務
- 16. Guava EventBus:它在GUI應用程序中的位置?
- 17. 我可以將靜態方法註冊爲Guava EventBus訂戶嗎?
- 18. 在Vaadin處理不可序列化的Guava EventBus與會話序列化
- 19. Guava CacheLoader拋出並捕獲自定義異常
- 20. Findbugs能檢測到在java中捕獲RuntimeException嗎?
- 21. 致命錯誤:未捕獲的異常 '的RuntimeException'
- 22. 獲取的RuntimeException甚至有嘗試捕捉
- 23. RuntimeException捕獲請求偵聽器 - > Twig錯誤模板
- 24. libgdx捕獲所有的異常,只提供RuntimeException而不是原始的
- 25. Guava EventBus:收聽事件超類型(如EventObject或Object)意味着什麼?
- 26. 在Multimaps中獲取值 - Guava
- 27. Android:在AsyncTask上獲取RuntimeException
- 28. Mosby&EventBus
- 29. Guava ImmutableSortedSetMultimap?
- 30. phantomjs不捕獲
你能解決這個問題嗎? – 2012-02-10 21:41:04
鏈接固定,現在就試試。 – 2012-02-10 22:40:24