繁体   English   中英

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

[英]Multiple exception logging for single problem - how to handle this?

捕获包的模式以及在每个捕获点重新抛出和记录会导致日志中的多个条目。 你平时做些什么 ?

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

包装不是问题,因为如果你查看堆栈跟踪,框架不会重复。 原因仅包含包装下方的框架。

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

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

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

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

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

使用多种方法最好这样做:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM