【发布时间】:2009-03-23 16:49:26
【问题描述】:
C# 开发: 我正在使用不同参数的 try catch 块中调用 web 服务/其他方法,其中一些参数可能是自定义对象。请评论在发生异常时将参数记录在文本文件中的最佳方式。也可以从对象中跳过一些字段(例如,如果对象包含我不想记录到文本文件的图像文件)
感谢您的宝贵时间
【问题讨论】:
-
这也是在 C# 中完成的
标签: c# exception-logging
C# 开发: 我正在使用不同参数的 try catch 块中调用 web 服务/其他方法,其中一些参数可能是自定义对象。请评论在发生异常时将参数记录在文本文件中的最佳方式。也可以从对象中跳过一些字段(例如,如果对象包含我不想记录到文本文件的图像文件)
感谢您的宝贵时间
【问题讨论】:
标签: c# exception-logging
简短的回答是,你不能,而不是不经过圈子。
当您收到异常时,它包含堆栈跟踪信息,但该信息不包含有关当时传递给方法的参数的任何内容。
要解决这个问题,您必须将参数存储在异常处理程序代码中,以便在处理异常时可以访问它们。
例如,您将拥有一个对象,将参数实例传递给(连同它们的名称),然后在您的 catch 块中调用该对象的方法。
【讨论】:
您可以为您的对象提供一个 to_string 方法,该方法可以根据需要显示它们。如果你想聪明一点,你甚至可以让他们第一次提供完整的详细信息,然后在以后使用时参考完整版本(以免你的日志变得难以阅读)。
如果他们没有一个好名字作为参考,你可以给他们分配一些东西(比如“AxilWidget #7”或“PendingWhackQueue #14”)。
在许多情况下,这可以使日志更易于阅读,如果您要使用循环递归地序列化对象结构,这一点至关重要。如果对象在报告之间可能发生显着变化,您必须特别小心 - 比如说始终包含包含这些成员的摘要,即使在反向引用中也是如此。
【讨论】:
我建议您查看PostSharp。您可以使用属性来声明您希望某些代码“围绕”正常方法执行。该代码可以使用方法的参数,并且可以确保仅在原始代码抛出异常等情况下才记录它。
这种横切关注点正是 AOP 的设计目的。我不知道 PostSharp 与 Web 服务的配合情况如何,但我无法想象你是第一个想要这个的人。
您将能够向属性添加属性以指定要跳过的任何参数等。
【讨论】: