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