是否可以(错误地)使用Exception.HelpLink来识别异常对象?

时间:2011-06-11 02:19:38

标签: c# .net exception exception-handling custom-exceptions

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

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

但这可能是一个坏主意吗?有没有涉及我没有想过的陷阱?如果是这样,有没有人有更好的主意?

编辑: 为了解释这种情况,这个记录器只能在我自己的程序中使用。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

肯定不能使用Exception.HelpLink因为记录器应该只关注以给定格式或任何默认格式记录异常信息。如果同样的异常反复出现则执行程序集或程序的问题不是记录器。

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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