更高级别的错误处理

时间:2014-10-24 09:59:10

标签: java spring hibernate exception-handling error-handling

我在较低级别有try/catch个块来处理大多数错误,但我被告知我们需要一个接近顶部,基本上作为一个catch all允许程序在出现错误时继续正常运行。我在顶层放置了try/catch(Exception e)/finally所有内容,但我们仍然遇到导致崩溃的异常。我一直在寻找任何线索的堆栈跟踪......它是这样开始的(如果有帮助,我可以发布更多信息):

111858 [SimpleAsyncTaskExecutor-2] DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a] java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("DATABASE"."TABLE"."COLUMN")

奇怪的是,堆栈跟踪的其余部分永远不会回到我们的任何东西。这一切都是oracle / apache / hibernate / springframework,直到它最终结束:

at java.lang.Thread.run(Thread.java:795) [na:1.7.0]

任何想法为什么它不会回到我们的代码或如何更好地实现这个“赶上所有”? finally块用于我们想要实现的一些步骤,无论是否存在错误。

为了清晰起见,

编辑,因为它可能有所帮助,这是每5分钟处理一次文件的批处理的一部分。 try / catch就像这样:

try{
    //process file
}catch(Exception e){
    //log exception
}finally{
    //mark file as processed so it doesn't keep trying to reprocess a broken file
}

2 个答案:

答案 0 :(得分:1)

您或您正在使用的库必须在某个地方产生一个线程,而该线程正在抛出异常。

您的选择

  1. 跟踪该线程的创建,并从那里处理异常
  2. 跟踪线程所属的线程组和register an exception handler with that thread group

答案 1 :(得分:0)

我可以建议实现这个“全部捕获”的最佳想法是不要这样做。

相反,我会在班级推荐defensive programming。每个类应尽可能处理自己可能的异常。这可以节省您出现问题的时间,并且您必须追踪到哪里来。

您需要调试并找到创建线程的位置并在那里处理异常。