5

我正在开发一个日志程序,我想避免在Exception重复记录同一对象时重复处理它,因为它正在通过嵌套调用结构向上渗透。因此,我希望能够对Exception对象进行一次格式化,并为格式化的版本提供一个唯一的“异常号”,然后Exception以某种方式标记该对象,以便如果它在以后的日志调用中再次出现,我可以识别它。

我想出的想法是滥用对象的HelpLink领域Exception。我将它设置为包含我的“异常号”的字符串版本。Exception然后,如果它在另一个日志调用中再次出现,我可以识别该对象。

但这可能是个坏主意吗?有没有我没有想到的问题?如果是这样,有人有更好的主意吗?

编辑:为了进一步解释这种情况,这个记录器只会用于我自己的程序。

4

5 回答 5

9

除了“滥用”HelpLink属性,您可以使用 Data属性将额外信息添加到Exception. 它包含提供有关异常的其他用户定义信息的键/值对。

于 2011-06-11T02:33:19.250 回答
4

虽然我同意 TheVillageIdiot,但我要指出,更一般地说,如果您想更改 Exception 的行为,那么您应该创建自己的 Exception 类来添加额外的相关信息。毕竟,这就是我们使用继承和多态的原因。:)

于 2011-06-11T02:30:44.287 回答
2

绝对不能使用Exception.HelpLink,因为 logger 应该只关注以给定格式或任何默认格式记录异常信息。如果同样的异常一次又一次地出现,那是执行程序集或程序的问题,而不是记录器的问题。

更好的是,您可以探索log4net用于日志记录和自定义报告界面的选项,以从 log4.net 创建/更新的日志文件或数据库表中格式化/分组异常

于 2011-06-11T02:26:55.443 回答
0

您的代码不应该在每个级别都捕获和记录异常。您的代码没有理由两次看到相同的异常。这听起来很像您在使用“捕获每个异常”,这是一种主要的反模式。

于 2011-06-13T01:47:54.677 回答
0

不,滥用 HelpLink 是不可接受的。正如@Greebo 提到的,如果您需要其他属性,您可以创建自己的异常类。另一种方法可能是使用Data属于System.Exception该类的属性。

问题:您的异常处理程序是否在进行除日志记录以外的任何处理?

如果不是,那么很可能您不需要处理程序。只需让异常(使用 finally 块进行清理)冒泡调用堆栈并在最外层处理它。如果您的处理程序正在处理异常,那么我不确定为什么您会在堆栈的更远处遇到相同的异常。我认为您更有可能创建一个新的异常,将内部异常设置为已处理的异常。

于 2011-06-11T02:33:57.383 回答