gpt4 book ai didi

java - 处理监听器抛出的java异常

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:05 25 4
gpt4 key购买 nike

假设您正在为旨在异步运行的对象编写库。为了通知调用者异步对象的状态,调用者必须实现监听器接口(interface)。

现在,当使用监听器时,监听器有可能会做一些错误的事情,这将导致在库对象中抛出异常。

例子

public interface SomeListener {
public void progressNotification(int status);
}

public class SomeClass {
SomeListener listener = null;

public void setListener(SomeListener listener) {
this.listener = listener;
}

public void someRandomMethod() {

int progressStatus = 0;
//Do some stuff here that updates progressStatus

//then notify the caller
if (listener != null) {
listener.progressNotification(progressStatus);
}
}
}

public class CallerClass implements SomeListener{
public void progressNotification(int status) {
//do something that will throw an exception
//e.g assume status is 0
int x = 200/status; //this will throw an ArithmeticException because of division by zero
}
}

如果 SomeClass 没有捕获异常并处理它,这将导致 listener.progressNotification(progressStatus); 之后的任何代码都不会被执行而离开对象处于“不正确”的状态。

所以我的问题是,在库中处理这种异常的最佳方法是什么?

我见过一个图书馆这样做:

    if (listener != null) {
try {
listener.progressNotification(progressStatus);
}catch (Thrwowable th) {
System.err.println("An uncaught throwable " + th);
}
}

我觉得不对。

最佳答案

对我来说,监听器的契约应该是明确定义的:

  • 它必须快速返回(即不暂停或 hibernate 线程等),
  • 它不能抛出任何运行时异常。

如果确实抛出运行时异常,则监听器会破坏 API 契约,因此这是 API 客户端代码的错误,而不是 API 本身的错误。

除了清楚地定义和记录契约(Contract),并解释违反契约(Contract)的潜在影响(即不确定状态,无论如何),我不会做任何事情。如果客户真的想保护自己免受编程错误的影响,他仍然可以将所有监听器代码包装在 try/catch 中,如您的示例所示。

关于java - 处理监听器抛出的java异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205866/

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