【问题标题】:Most Efficient Way to log Invocation Parameters For a Method in case of an exception在发生异常时记录方法的调用参数的最有效方法
【发布时间】:2009-03-23 16:49:26
【问题描述】:

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

感谢您的宝贵时间

【问题讨论】:

  • 这也是在 C# 中完成的

标签: c# exception-logging


【解决方案1】:

简短的回答是,你不能,而不是不经过圈子。

当您收到异常时,它包含堆栈跟踪信息,但该信息不包含有关当时传递给方法的参数的任何内容。

要解决这个问题,您必须将参数存储在异常处理程序代码中,以便在处理异常时可以访问它们。

例如,您将拥有一个对象,将参数实例传递给(连同它们的名称),然后在您的 catch 块中调用该对象的方法。

【讨论】:

    【解决方案2】:

    您可以为您的对象提供一个 to_string 方法,该方法可以根据需要显示它们。如果你想聪明一点,你甚至可以让他们第一次提供完整的详细信息,然后在以后使用时参考完整版本(以免你的日志变得难以阅读)。

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

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

    【讨论】:

      【解决方案3】:

      我建议您查看PostSharp。您可以使用属性来声明您希望某些代码“围绕”正常方法执行。该代码可以使用方法的参数,并且可以确保仅在原始代码抛出异常等情况下才记录它。

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

      您将能够向属性添加属性以指定要跳过的任何参数等。

      【讨论】:

        猜你喜欢
        • 2019-10-13
        • 2017-04-13
        • 2011-04-04
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 2012-11-09
        相关资源
        最近更新 更多