单个问题的多个异常记录 - 如何处理?

时间:2011-01-04 21:49:38

标签: java logging exception-handling

catch catch的模式以及每个catch-point的re-throw和logging都会导致日志中出现多个条目。你通常做什么?

5 个答案:

答案 0 :(得分:3)

在单个catch块中,使用EITHER句柄(可能就像记录一样简单)或抛出(重新抛出异常,或者包装它并抛出新的异常),而不是两者兼而有之。

包装不是问题,因为如果查看堆栈跟踪,则不会重复帧。原因只包含包装下面的框架。

答案 1 :(得分:3)

任何个别例外都只应记录在1个位置,以避免堵塞日志。只要异常包含原始原因,您就应该能够追溯到它。

我个人做以下事情: 在最低级别点捕获已检查的异常,我可以在RuntimeException(或子类)中包含最佳消息,以详细说明发生异常时发生的情况并重新抛出。在低级别没有记录。在它可以影响用户之前,以非常高的级别捕获未经检查的(运行时)异常。它会被记录(原因)并转换为最终用户的有用信息。

这仅适用于无法处理的异常(最常见)。连接重试等其他情况,但我认为这不是你问题的主要观点。

答案 2 :(得分:1)

除非您认为通过这样做增加了一些价值,否则我不会抓住并换行。在这种情况下,您希望每个图层都显示在日志中。你不想要的任何图层,都不要把它们放在那里。

如果您无法控制包装,可以取消包装并丢弃它们,或者只是将它们放在日志中。

答案 3 :(得分:1)

最好使用多种方法:

  • 尽量不要捕获每个异常,而是声明你的方法/构造函数抛出这些异常并从调用链上方的代码中捕获它们。除非您需要关闭资源(例如数据库句柄),否则捕获和重新投掷几乎没有意义。

  • 扩展您自己的异常类并将其他异常链接到其中。当你在它时,在你的Exception类中包含一个状态变量,看它是否已经被记录。

答案 4 :(得分:1)

检查异常通常不值得他们造成的麻烦。

我最喜欢的方法是将树上的检查异常提升到可以处理的位置,将其作为未经检查的异常包装一次并让它飞起来。

您也可以在每种方法中使用throws子句。

或者你将它陷入低级并实际处理它并将其作为错误代码返回。

处理异常的最好方法是永远不要生成它们。 (例如,如果您尝试打开可能存在或不存在的文件,而不是打开它,然后在打开失败时创建它,测试它,必要时创建它然后打开它并完全避免异常。