有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java捕获异常和错误

我们有一段从队列中读取的代码

while(true){
   try {
        message = readMessageFromQueue();
        processMesage(message); //Writes into DB and some other operation
   }catch(Exception e) {
    log the exception
   }
}

现在有10个线程是使用executor服务生成的,目的是永远运行。然而,我们注意到,经过一段时间的部署(可能是10-15天或一个月),线程数量正在减少(每秒写入也因此而减少)

问题是我们应该捕获错误还是只捕获代码中的异常,我们希望永远这样运行,并且捕获异常是否会导致此问题


共 (4) 个答案

  1. # 1 楼答案

    捕获Exception是一种处理异常的“散弹枪”方法——“无论您抛出什么异常,我都会捕获它!”

    捕获一个特定的、理想的自定义异常是首选的,这主要是因为您知道该异常被抛出的位置,并且您可以优雅地处理该异常,或者专门针对某个异常执行一些方法。因此,您可以更好地控制应用程序

    希望这有帮助

  2. # 2 楼答案

    是的,在那里抓Throwable更好,而不仅仅是Exception。例如,根据您的处理过程,您可能会得到一个StackOverflowError,它将在不记录日志的情况下终止您的线程。您可能无法从中恢复,但至少可以调试问题

  3. # 3 楼答案

    我更喜欢捕捉特定的异常,因为我可以优雅地处理该故障(例如重试或执行一些默认行为)。但是,如果异常意味着程序无论如何都无法继续,那么捕获最常见的异常并终止就可以了

  4. # 4 楼答案

    据我所知,你们在问,一般异常和特殊异常(比如BoundsException的数组)是否可以捕获。所以,我想我的答案取决于你喜欢什么。您可以通过异常捕获,这通常是不建议的,因为您应该始终知道代码在做什么,从而知道什么可能出错,但它确实完成了您的任务。现在,您应该通过特定异常捕获的原因是您可以使用不同的方法来处理不同的错误。可能您处理错误的方式并不适用于所有错误,因此当线程看到一个非预期的异常时,它会崩溃,只剩下一个线程