我不确定在线程中处理RuntimeException
的最佳方法是什么。
假设我有一个线程A,它使用第三方函数b()
将数据发送到服务器S.现在b()
可能抛出一些RuntimeException并且无法将数据推送到指定的服务器。在这种情况下,我必须运行一个方法c()
,将数据推送到本地数据库。现在方法c()
如果无法写入数据库,也可以抛出RuntimeException
。
示例:
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()
。
处理此问题的一种方法是在try-catch块周围包装b()
和c()
并捕获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
}
}
}
虽然这有效,但我不太习惯以这种方式捕获泛型异常。其他建议似乎是通过Future对象处理异常(当提交给某些执行程序服务时)。这是一种更好的做法吗?如果是这样,为什么?
答案 0 :(得分:0)
如果方法B
和C
抛出RuntimeException
的子类,请抓住那些例外情况。使用e.getClass().getName()
找出您获得的RuntimeExceptions,并正确处理它们。
我会说抛出'纯'RuntimeExcpetions
的方法写得不好。但是,从Exceptions
(例如RunttimeException
)抛出继承的NumberFormatException
的方法可能设计得很好(有关简单提示,请参阅下面的链接)。希望B
和C
设计得很好。
有关与您的问题相关的易于阅读的信息,请参阅https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
答案 1 :(得分:0)
首先,你永远不应该抓住RuntimeException
,因为它们并不意味着被抓住。它们表明您的算法存在问题,当您看到它时,您应该去修复您的代码。
任何为预期的故障情况抛出RuntimeException的库都设计得不好。
如果你正在构建一个解决方案只是为了保持你的线程正常工作(因为你必须使用一个设计不合理的库),请使用try-catch块包围方法调用,这将捕获已检查和未检查的异常。