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与服务器联系时出现问题。这显然是一个运行时异常,对吗?但是我仍然想处理它。@user1955184
SSLException
不是
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
             }
        }
    }