Java 如何在线程内处理RuntimeException
我不确定在线程中处理Java 如何在线程内处理RuntimeException,java,exception-handling,java-threads,Java,Exception Handling,Java Threads,我不确定在线程中处理RuntimeException的最佳方法是什么。 假设我有一个线程a,它使用第三方函数b()将数据发送到服务器s。现在b()可能引发一些运行时异常,无法将数据推送到指定的服务器。在这种情况下,我必须运行一个方法c(),将数据推送到本地数据库。现在,如果方法c()无法写入数据库,它也可以抛出运行时异常 例如: public class A() extends Runnable { @Override public void run() { //
RuntimeException
的最佳方法是什么。
假设我有一个线程a,它使用第三方函数b()
将数据发送到服务器s。现在b()
可能引发一些运行时异常,无法将数据推送到指定的服务器。在这种情况下,我必须运行一个方法c()
,将数据推送到本地数据库。现在,如果方法c()
无法写入数据库,它也可以抛出运行时异常
例如:
public class A() extends Runnable {
@Override
public void run() {
// throws some specific RuntimeExceptions in case it fails
b(data, "<some https end point>");
}
}
虽然这是可行的,但我不太习惯用这种方式捕获泛型异常。其他建议似乎是通过将来的对象处理异常(当提交给某个执行器服务时)。这是更好的做法吗?如果是,原因是什么?如果方法B
和C
抛出RuntimeException
的子类,则捕获这些异常。使用e.getClass().getName()
找出您得到的运行时异常,并适当地处理它们
我要说的是,抛出'pure'RuntimeExceptions
的方法编写得不好。但是抛出继承自RunttimeException
的异常的方法(例如NumberFormatException
)可能设计得很好(有关简单提示,请参阅下面的链接)。希望B
和C
设计良好
有关与您的问题相关的易于阅读的信息,请参见首先,您不应该捕获运行时异常,因为它们不应该被捕获。它们表明你的算法有问题,当你看到它时,你应该去修复你的代码。
任何为预期的失败情况抛出RuntimeException的库都设计得不好
如果您构建的解决方案只是为了保持线程正常工作(因为您必须使用设计不当的库),请使用try-catch块围绕方法调用,该块将捕获选中和未选中的异常。注意:如果B
和C
是方法,则它们应该以小写字母开头。是的。很抱歉我已经做了编辑,我明白你的意思。但问题是,您使用的方法可能会使用其他方法,而这些方法又会抛出RunTimeException的不同子类。我不可能知道所有可能的异常,对吗?您是对的,但这适用于所有方法(在第三方libs和您自己的代码中)。RuntimeException背后的想法(至少有一个)是,在任何地方捕获所有内容都是不合理的。如果您得到一个RuntimeException,您应该假设这是因为代码有问题(有人在做b/a之前忘记检查a==0,等等)。如果可能,应处理该编程错误。如果这不可能,您可以捕获异常并进行变通实现。找到第三个运行时异常的最佳方法可能是测试。让我们考虑一个例子,在第三方方法中,当它不能通过HTTPS联系服务器时,会抛出一个<代码> SSLExebug >代码>。这显然是一个运行时异常。我仍然想处理它。在那种情况下,你建议一个人做什么?客户端代码中没有任何编程错误。请更正。知道SSLException
不是RuntimeException
。在我的例子中,它被另一个FailsafeException
(这是一个运行时)包装。然后我建议您捕获FailsafeException
(而不是RuntimeException
)并执行“适当的操作”,例如打印错误消息,设置一个布尔值,告诉线程中断,触发侦听器,等等。如果您对其他错误情况也使用了FailsafeException
,您可以将isSSLProblem()
添加到FailsafeException
中,并使用它生成更好的错误消息等。但这不是很常见吗?例如,我使用的第三方方法会抛出一个SSLException
,以防该方法无法通过https与服务器联系时出现问题。这显然是一个运行时异常,对吗?但是我仍然想处理它。@user1955184SSLException
不是RuntimeException
@EJB我的坏。你是对的。我正在使用FailSafe
库进行重试,将SSLException
包装为FailsafeException
(这是一个RuntimeException
)
public void run() {
// throws some specific RuntimeExceptions in case it fails
try {
b(data, "<some https end point>");
} catch (RuntimeException e) {
try {
c(data)
} catch(RuntimeException e) {
//Log the error
}
}
}