我们有一段代码从队列中读取
while(true){
try {
message = readMessageFromQueue();
processMesage(message); //Writes into DB and some other operation
}catch(Exception e) {
log the exception
}
}
现在有十个线程使用执行程序服务生成,目的是永远运行。然而,我们注意到在一段时间后我们部署(可能是10-15天或月)线程数量减少(由于这个原因,每秒写入次数也在减少)。
问题是我们是否应该在代码中捕获Error或者只是异常,我们想要像这样永远运行并且正在捕获Exception会导致这个问题吗?
答案 0 :(得分:2)
是的,最好在那里抓住Throwable
,而不仅仅是Exception
。例如,根据您的处理,您可能会获得一个StackOverflowError
,它会在没有记录的情况下终止您的线程。您可能无法从中恢复,但至少您可以调试后一个问题。
答案 1 :(得分:0)
根据我的理解,您可以通过一般异常和特定异常(如ArrayOutOfBoundsException)来确定是否可以捕获。所以,我想我的答案归结为你喜欢的任何东西。您可以通过异常捕获,这通常不建议,因为您应该始终知道您的代码正在做什么,从而可能出错,但它确实完成了您的任务。现在,您应该捕获特定异常的原因是您可以使用不同的方法来处理不同的错误。也许您处理错误的方式并不普遍适用于所有错误,因此当线程看到异常时,它不会被设计为期望,它会崩溃而使您减少一个错误。
答案 2 :(得分:0)
我更喜欢捕获特定的异常,因为我可以优雅地执行该失败(例如重试或执行某些默认行为)。但是,如果异常意味着程序无论如何都无法继续,那么捕获最通用的异常并终止就可以了。
答案 3 :(得分:0)
捕捉Exception
是一种异常处理的“霰弹枪”方法 - “无论你抛出什么异常,我都会抓住它!”。
首选捕获特定的,理想的自定义异常,主要是因为知道抛出异常的位置,并且您可以优雅地处理该异常,或者专门针对某个异常执行某些方法。因此,您可以更好地控制您的应用程序。
希望这会有所帮助。