C# 在异常情况下记录方法调用参数的最有效方法

C# 在异常情况下记录方法调用参数的最有效方法,c#,exception-logging,C#,Exception Logging,C#发展: 我正在使用不同的参数调用try-catch块中的webservice/其他方法,其中一些可能是自定义对象。请评论在异常情况下将参数记录在文本文件中的最佳方式。也可以跳过对象中的某些字段(例如,如果对象包含我不想登录到文本文件的图像文件) 谢谢你抽出时间来简单的回答是,你不能,除非你经历困难 当您得到一个异常时,它包含堆栈跟踪信息,但该信息不包含任何关于当时传递给该方法的参数的信息 为了避免这种情况,必须将参数存储在异常处理程序代码中,以便在处理异常时可以访问这些参数 例如,您将拥有一

C#发展: 我正在使用不同的参数调用try-catch块中的webservice/其他方法,其中一些可能是自定义对象。请评论在异常情况下将参数记录在文本文件中的最佳方式。也可以跳过对象中的某些字段(例如,如果对象包含我不想登录到文本文件的图像文件)


谢谢你抽出时间来

简单的回答是,你不能,除非你经历困难

当您得到一个异常时,它包含堆栈跟踪信息,但该信息不包含任何关于当时传递给该方法的参数的信息

为了避免这种情况,必须将参数存储在异常处理程序代码中,以便在处理异常时可以访问这些参数


例如,您将拥有一个对象,您可以将参数实例及其名称传递给该对象,然后在catch块中对该对象调用一个方法。

您可以为您的对象提供一个to_string方法,该方法可以按照您的需要显示它们。如果你想变得聪明,你甚至可以让他们第一次给出他们的全部细节,然后在以后的使用中参考完整版本(以免你的日志变得难以理解的混乱)

如果他们没有一个好名字作为参考,你可以给他们分配一些东西(比如“AxilWidget#7”或“PendingWhackQueue#14”)

在许多情况下,这可以使日志更易于阅读,如果要使用循环递归序列化对象结构,这一点至关重要。如果对象在两次报告之间可能发生重大变化,您必须特别小心——比如始终包含包含这些成员的摘要,即使在反向引用中也是如此。

我建议您研究一下。您可以使用属性来声明您希望某些代码“围绕”普通方法执行。该代码可以使用该方法的参数,并且可以确保只有在原始代码引发异常时才记录该方法,等等

这种横切关注点正是AOP设计的目的。我不知道PostSharp与web服务的配合有多好,但我无法想象你是第一个想要这个的人


您可以将属性添加到属性中,以指定要跳过的任何参数等。

这也可以在C中完成#