【问题标题】:Try... Catch block infestation尝试... 捕获块感染
【发布时间】:2013-02-07 23:31:14
【问题描述】:

我正在为一家公司开发一套 Excel 插件。我以前没有做过加载项,所以我对一些错综复杂的东西不是很熟悉。在交付我的第一个产品后,用户遇到了我在测试期间没有遇到/遇到/注意到的错误。此外,我很难从 Visual Studios 调试环境中复制它们。

我最终编写了一个轻量级的日志记录类,它接收来自程序各个部分的消息。该程序并不庞大,因此并不是很多工作。但我最终得到的是几乎每一行代码都包含在 Try...Catch 块中,这样我就可以记录用户环境中发生的事情。

我认为我实现得足够体面,我试图避免包装对其他类或模块的调用,而是将块放在调用中,这样我就可以更准确地识别出谁在抛出,而且我没有吞下任何东西,我在我记录了我感兴趣的信息后总是抛出异常。

我的问题是,基本上,这样可以吗?有没有更好的方法来解决这个问题?我离开基地了吗?

快速编辑:重要的是,它确实有效。我能够确定错误并解决它。

【问题讨论】:

  • 您可以选择只记录异常 - 堆栈跟踪应该为您提供与您现在获得的所有相同的信息,而且输入、维护和可读性的成本要低得多。
  • 您可能想使用Trace Listeners。将整个项目包含在 TryCatch 中可能相当危险。另外,TryCatch 通常有更大的开销。
  • IntelliTrace 是否可以与 Excel 加载项一起使用?
  • 谢谢大家的建议。我将研究一下优化,并研究一些替代的生产调试方法。

标签: c# excel debugging testing try-catch


【解决方案1】:

不,你并没有离谱。我相信这是编写插件时处理错误的唯一方法。我自己正在销售一个使用这种模式的 Outlook 加载项。不过有几点注意事项:

  1. 你只需要封装顶层方法,要么直接暴露给用户界面,要么由其他事件触发。

  2. 确保您的日志记录例程递归遍历异常树,同时记录 InnerExceptions。

  3. 您可以考虑显示某种错误表单,而不是重新抛出异常。

然后是对这些笔记的几个 cmets:

  1. 我相信您理解这一点,但您的评论“几乎每一行代码都被包装(...)”让我想强调这一点。但是是的,所有您的代码最终应该以catch (System.Exception)-block 结束,以便您可以记录您的异常。我完全不同意格雷格说这是“危险的”。危险的是不处理您的异常。

  2. 如果您这样做,我认为您不需要“避免包装对其他类和模块的调用”,如果我理解正确的话。我发布了一个方便的扩展方法 GetAsString,它允许我记录我需要的内容at github

  3. 在 Outlook 中,如果异常冒泡到 Outlook 本身,则您的加载项可能会被禁用,如果它发生在后台线程上,甚至会使 Outlook 崩溃。 Excel中不一样吗?因此,我竭尽全力不让 any 异常出现在我的应用程序之外。当然,您需要确保您的应用程序在此之后可以继续运行,或者允许正常关闭。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2020-07-31
    • 2017-04-14
    • 2021-03-04
    相关资源
    最近更新 更多