我正在开发一个日志记录程序,我想避免重复记录时反复处理相同的Exception
对象,因为它通过嵌套的调用结构渗透。所以我希望能够格式化Exception
对象一次,并为格式化版本提供一个唯一的“异常编号”,然后以某种方式标记Exception
对象,这样如果它出现就可以识别它再次在以后的日志电话中。
我想出的想法是滥用HelpLink
对象的Exception
字段。我将它设置为包含我的“例外号码”的字符串版本。然后我可以识别Exception
对象,如果它在另一个日志调用中暂时再次出现。
但这可能是一个坏主意吗?有没有涉及我没有想过的陷阱?如果是这样,有没有人有更好的主意?
编辑: 为了解释这种情况,这个记录器只能在我自己的程序中使用。
答案 0 :(得分:8)
您可以使用Data
property向HelpLink
添加额外信息,而不是“滥用”Exception
属性。它包含键/值对,提供有关异常的其他用户定义信息。
答案 1 :(得分:4)
虽然我同意TheVillageIdiot,但我会指出,更一般地说,如果你想改变Exception的行为,那么你应该创建自己的Exception类来添加其他相关信息。毕竟,这就是我们使用继承和多态的原因。 :)
答案 2 :(得分:2)
肯定不能使用Exception.HelpLink
因为记录器应该只关注以给定格式或任何默认格式记录异常信息。如果同样的异常反复出现则执行程序集或程序的问题不是记录器。
更好的是,您可以探索使用log4net
进行日志记录和自定义报告界面的选项,以便从log4.net创建/更新的日志文件或数据库表格式化/分组异常
答案 3 :(得分:0)
不能滥用HelpLink是不可接受的。正如@Greebo提到的,如果你需要其他属性,你可以创建自己的异常类。另一种方法是使用属于Data
类的System.Exception
属性。
问题:您的异常处理程序是否正在执行除日志记录之外的任何处理?
如果没有,则很可能您不需要处理程序。让异常(使用finally块进行清理)冒泡调用堆栈并在最外层处理它。如果您的处理程序正在处理异常,那么我不确定为什么在堆栈中会有相同的异常。我认为你更有可能创建一个新的异常,将内部异常设置为被处理的异常。
答案 4 :(得分:0)
您的代码不应该捕获并在每个级别记录异常。您的代码没有理由两次看到相同的异常。这听起来非常像你正在使用“捕捉每一个例外”,这是一个主要的反模式。