【问题标题】:Error handling at a higher level更高级别的错误处理
【发布时间】:2014-12-20 03:54:06
【问题描述】:

我在较低级别有try/catch 块来处理大多数错误,但有人告诉我我们需要一个靠近顶部的块,基本上是为了让程序在出现错误时继续正确运行。我在顶层的所有内容周围都添加了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
}

【问题讨论】:

  • 请给我们看一些相关代码,比如顶级try catch
  • @ToYonos 顶级 try/catch 已经在里面了。这是try{//do stuff}catch(Exception e){//log stuff} finally{//do more stuff}

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


【解决方案1】:

我可以建议的最佳想法是不要这样做。

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

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

【讨论】:

  • 我们正在尝试进行防御性编程,但我们无法考虑所有问题。这实际上是一个正在处理文件的批处理。这个想法是,如果文件由于我们没有想到的任何原因而出现问题,它将被放在一边,而不是继续尝试处理它。
  • 因此将文件的处理分解为小任务。如果一项任务很危险,请将 try catch 包裹起来。 try-catch这种东西太多了。
  • 如果异常永远不会回到我们的代码中,这将有什么帮助?
【解决方案2】:

您或您正在使用的库必须在某处产生一个线程,而正是该线程引发了异常。

你的选择是

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

【讨论】:

  • 我对使用线程组不是很熟悉。如果它是一个产生新线程的库,那么 2 会起作用吗?
  • 可能。有一个默认线程组可以使用,但这取决于相关线程的创建方式。恐怕问题中没有足够的细节来为您确定这一点,我只能提供一些指导。您可以要求 Java 打印出所有正在使用的线程的列表(参见 jstack 命令,或向 java 进程发送 kill -3 信号),如果这不包括它们的线程组,那么 Thread 类确实提供您需要编写一个实用程序来做到这一点。调试器对于检查此类信息也非常有用。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多