"事件"中的Java异常处理

5 java events exception

我想就如何在"事件"(键输入,屏幕更新等)中处理异常获得第二意见.在这种情况下,我可以控制事件发送者.

因此,模块设置为处理事件(它实现了一个侦听器接口,并针对事件发送器进行了注册):

public void DefaultSet ( CardData oldDefault, CardData newDefault )
{
}
Run Code Online (Sandbox Code Playgroud)

事件发件人只是:

        for ( Enumeration e = listeners.elements(); e.hasMoreElements(); )
        {
            RetrieverListener thisListener = (RetrieverListener) e.nextElement();
            thisListener.DefaultSet( oldDefault, newDefault );
        }
Run Code Online (Sandbox Code Playgroud)

因此,如果/当接收器出现问题时:

  • 我应该尝试在那里处理异常,并且不要向发送者扔回任何东西吗?有时听众没有正确处理错误的"上下文",是吗?

  • 是否不赞成将异常抛回事件发送模块,以文档的方式处理?例如"抛出IOException将导致重置......".这看起来与我读过的javadoc不符.

  • 当出现问题时我是否应该记录并忽略异常并且无法对此进行任何操作?

Nat*_*Nat 6

Java约定是侦听器方法不会抛出异常.显然,编程错误可能会使侦听器抛出RuntimeException,但事件源无法从中恢复,因为它会使程序的对象处于某种未知的,可能不一致的状态.

因此,由侦听器捕获已检查的异常并从中恢复(例如,回滚事务)或将其报告给其他对象.我经常使用一个看起来像这样的ErrorHandler接口:

public interface ErrorHandler {
    public void errorOccurred(String whatIWasTryingToDo, Exception failure);
}
Run Code Online (Sandbox Code Playgroud)

事件侦听器告诉其ErrorHandler有关已发生的错误.

public class SomeClass implements SomeKindOfListener 
    private final ErrorHandler errorHandler;
    ... other fields ...

    public SomeClass(ErrorHandler errorHandler, ... other parameters ... ) {
        this.errorHandler = errorHandler;
        ...
    }

    public void listenerCallback(SomeEvent e) {
        try {
            ... do something that might fail ...
        }
        catch (SomeKindOfException e) {
            errorHandler.errorOccurred("trying to wiggle the widget", e);
        }
    }         
}
Run Code Online (Sandbox Code Playgroud)

我用这样的实现初始化事件监听器,以在应用程序中的任何方面处理故障.例如,它可能会弹出一个对话框,在状态栏中显示一个闪烁的错误图标,记录审核消息或中止该过程.