java - 如何在线程中处理 RuntimeException

标签 java exception-handling java-threads

我不确定在线程中处理 RuntimeException 的最佳方法是什么。 假设我有一个线程 A,它使用第 3 方函数 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()

处理这个问题的一种方法是将 b()c() 包裹在一个 try-catch block 周围并捕获一个 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 对象处理异常(提交给某些执行程序服务时)。这是更好的做法吗?如果是,为什么?

最佳答案

首先,您永远不应该捕获 RuntimeException,因为它们不应该被捕获。它们表明您的算法存在问题,当您看到它时,您应该去修复您的代码。 任何为预期的失败情况抛出 RuntimeException 的库都设计得不好。

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

关于java - 如何在线程中处理 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47069352/

相关文章:

用于 UTF8 字母的 JAVA 比较器

Java作业帮助

c# - Try Finally 或 Try Catch Finally

c# - 捕获从异步 lambda 抛出的异常

java - 如何从线程获取字符串或从线程返回字符串?

java - Android ImageView 克服线性布局

java - Spring boot、Oauth 授权回调 URL - 开发和生产设置

c++ - 抛出的对象分配在哪里?

java - 处理器和线程之间的区别

java - 线程在后台使用 JobService 时停止运行