捕获异常和错误

catching exception and error

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

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

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

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

据我了解,您是在询问是否可以通过一般异常与特定异常(如 ArrayOutOfBoundsException)进行捕获。所以,我想我的答案归结为你喜欢什么。您可以通过 Exception 进行捕获,这通常不被建议,因为您应该始终知道您的代码在做什么以及因此可能出错的地方,但它确实完成了您的任务。现在,您应该捕获特定异常的原因是您可以使用不同的方法来处理不同的错误。也许您处理错误的方式并不普遍适用于所有错误,因此当线程发现异常时它不是设计预期的,它会崩溃,让您少一个线程。

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

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

捕获 Exception 是一种 "shotgun" 异常处理方法 - "Whatever exception you will throw, I will catch it!"。

捕获一个特定的,最好是自定义的异常是首选,主要是因为你知道那个异常被抛出的地方,你可以优雅地处理那个异常,或者做一些专门针对某个特定的方法例外。因此,您可以更好地控制您的应用程序。

希望这对您有所帮助。