gpt4 book ai didi

"events"内的 Java 异常处理

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:12 24 4
gpt4 key购买 nike

我想就如何处理“事件”(按键输入、屏幕更新等)中的异常征求意见。在这种情况下,我可以控制事件发送者。

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

public void DefaultSet ( CardData oldDefault, CardData newDefault )
{
}

事件发送者很简单:

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

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

  • 我是否应该尝试处理那里的异常,并且永远不要将任何东西返回给发件人?有时听众没有“上下文”来正确处理错误,对吗?

  • 将异常抛回事件发送模块并以记录方式处理是否令人不悦?例如“抛出 IOException 将导致重置……”。从我读过的 javadoc 来看,这似乎是非标准的。

  • 当出现问题并且对此无能为力时,我是否应该只记录并忽略异常?

最佳答案

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

因此,由监听器来捕获已检查的异常并从中恢复(例如回滚事务)或将它们报告给其他对象。我经常使用类似于以下内容的 ErrorHandler 接口(interface):

public interface ErrorHandler {
public void errorOccurred(String whatIWasTryingToDo, Exception failure);
}

事件监听器将已发生的错误告知其 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);
}
}
}

我使用 this 的实现来初始化事件监听器,该实现以在应用程序中当时有意义的任何方式处理故障。例如,它可能会弹出一个对话框、在状态栏中显示一个闪烁的错误图标、记录一条审核消息或中止该过程。

关于 "events"内的 Java 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com