Tôi sử dụng EventBus của ổi, tiếc là nó bắt và ghi lại InvocationTargetException xảy ra khi một trình xử lý sự kiện ném một RuntimeException. Tôi có thể vô hiệu hóa hành vi này không?Ổ đĩa EventBus: không bắt RuntimeException
8
A
Trả lời
8
Khi đứng, đây là một quyết định thận trọng, và thảo luận trong các tài liệu EventBus:
Handlers không nên, nói chung, ném. Nếu có, EventBus sẽ bắt và ghi lại ngoại lệ. Điều này hiếm khi là giải pháp đúng để xử lý lỗi và không nên dựa vào; nó chỉ nhằm mục đích giúp tìm ra vấn đề trong quá trình phát triển.
giải pháp thay thế là being considered, mặc dù tôi nghiêm túc nghi ngờ họ sẽ làm cho nó thành phiên bản 12.
4
Dưới đây là mã cho lười biếng
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);
}
}
}
Bây giờ, bạn có thể đăng ký ExceptionEvent
.
Đây là ExceptionEvent
tôi cho chỉ cần sao chép & dán
@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
Chỉ cần kế thừa EventBus ổi, và viết bạn sở hữu eventbus tùy chỉnh. Mẹo: Lớp này nên viết trong gói com.google.common.eventbus, để phương thức nội bộ có thể được ghi đè.
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);
}
}
Các vấn đề liên quan
- 1. Lỗi khi lắp ổ đĩa
- 2. Phát hiện xem đĩa có nằm trong ổ đĩa DVD
- 3. IOKhông đủ dung lượng ổ đĩa khi truy cập ổ đĩa gắn Citrix
- 4. Lấy tên ổ đĩa (như trái ngược với ký tự ổ đĩa) trong Java
- 5. Làm cách nào để hủy kích hoạt ổ đĩa vật lý LVM2 để tháo ổ đĩa?
- 6. Ổ đĩa thể rắn có đủ tốt để ngăn chặn sự lo lắng về tắc nghẽn ổ đĩa IO không?
- 7. Lập bản đồ ổ đĩa mạng mà không cần mã hóa ổ đĩa trong một tập tin batch
- 8. Định dạng ổ đĩa bằng C++
- 9. Ổ đĩa danh sách Haskell trong Windows
- 10. script để ánh xạ ổ đĩa mạng
- 11. Liệt kê các ổ đĩa ngoài
- 12. Liên kết trực tiếp ổ đĩa Google
- 13. Mount/Unmount Ổ đĩa USB với VBSCript
- 14. Lấy danh sách các ổ đĩa logic
- 15. Git bash không thể nhận dạng ổ đĩa flash USB
- 16. Không gian ổ đĩa đói Cơ sở dữ liệu NoSQL
- 17. IOException cho ổ đĩa đầy đủ hoặc không gian
- 18. Có thể định dạng thẻ nhớ, ổ đĩa bút hoặc đĩa bằng Java không?
- 19. Có cách nào để phát hiện xem ổ đĩa có phải là ổ SSD không?
- 20. Thay đổi ký tự ổ đĩa trong NERDtree
- 21. Phân biệt theo chương trình giữa Ổ đĩa mềm USB và Ổ đĩa Flash USB trong Windows
- 22. Lập trình kiểm tra xem ký tự ổ đĩa có phải là ổ đĩa mạng/chia sẻ
- 23. Phát hiện sự kiện gắn ổ đĩa trong C#
- 24. Xóa dung lượng trống trên ổ đĩa cứng bằng C#
- 25. Vai trò EventBus trong GWT
- 26. PC boot: đăng ký dl và số ổ đĩa
- 27. Làm thế nào tôi có thể lấy danh sách tất cả các ổ đĩa mà còn nhận được loại ổ tương ứng (ổ đĩa di động, đĩa cục bộ hoặc đĩa CD-rom, dvd-rom ... vv)?
- 28. RuntimeException sử dụng Camera.open()
- 29. Vista UAC - Sự cố khi ánh xạ ổ đĩa mạng
- 30. Cách truy cập ổ đĩa mạng chia sẻ trong node.js
Bạn có thể sửa liên kết đó không? –
Đã liên kết cố định, hãy thử ngay bây giờ. –