可以(错误)使用Exception.HelpLink来识别Exception对象吗

本文关键字:Exception 识别 对象 HelpLink 可以 错误 使用 | 更新日期: 2023-09-27 17:58:49

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

我的想法是误用Exception对象的HelpLink字段。我会将其设置为包含我的"异常编号"的字符串版本。然后,如果Exception对象在另一个日志调用中再次出现,我就可以识别它。

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

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

可以(错误)使用Exception.HelpLink来识别Exception对象吗

您可以使用Data属性向Exception添加额外信息,而不是"滥用"HelpLink属性。它包含键/值对,它们提供有关异常的其他用户定义信息。

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

使用Exception.HelpLink肯定是不好的,因为记录器应该只以给定格式或任何默认格式记录异常信息。若同样的异常一次又一次地出现,那个就是执行程序集或程序的问题,而不是记录器的问题。

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

不,滥用HelpLink是不可接受的。正如@Greebo所提到的,如果你需要额外的属性,你可以创建自己的异常类。另一种选择可能是使用Data属性,该属性是System.Exception类的一部分。

问题:除了日志记录之外,您的异常处理程序还进行其他处理吗?

如果没有,那么很可能你不需要处理程序。只需让异常(使用finally块进行清理)出现在调用堆栈中,并在最外层进行处理。如果你的处理程序正在处理这个异常,那么我不知道为什么你会在堆栈的后面出现同样的异常。我认为您更有可能创建一个新的异常,将内部异常设置为已处理的异常。

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