如何在一个线程中处理RuntimeException

时间:2017-11-02 06:58:51

标签: java exception-handling java-threads

我不确定在线程中处理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对象处理异常(当提交给某些执行程序服务时)。这是一种更好的做法吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:0)

如果方法BC抛出RuntimeException的子类,请抓住那些例外情况。使用e.getClass().getName()找出您获得的RuntimeExceptions,并正确处理它们。

我会说抛出'纯'RuntimeExcpetions的方法写得不好。但是,从Exceptions(例如RunttimeException)抛出继承NumberFormatException的方法可能设计得很好(有关简单提示,请参阅下面的链接)。希望BC设计得很好。

有关与您的问题相关的易于阅读的信息,请参阅https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

答案 1 :(得分:0)

首先,你永远不应该抓住RuntimeException,因为它们并不意味着被抓住。它们表明您的算法存在问题,当您看到它时,您应该去修复您的代码。 任何为预期的故障情况抛出RuntimeException的库都设计得不好。

如果你正在构建一个解决方案只是为了保持你的线程正常工作(因为你必须使用一个设计不合理的库),请使用try-catch块包围方法调用,这将捕获已检查和未检查的异常。