【问题标题】:How to do Exception Handling & Tracing in C#如何在 C# 中进行异常处理和跟踪
【发布时间】:2011-02-16 05:54:15
【问题描述】:

我正在阅读一些 C# 书籍,并进行了一些练习,不知道该怎么做,或者不确定问题是什么意思。

问题:

在一家公司工作了一段时间后,您作为知识渊博的开发人员的技能得到认可,并且您被赋予“监管”在源代码 (C#) 中为企业应用程序执行异常处理和跟踪的任务正处于不断的增量发展中。产品架构师设定的两个目标是:

  1. 整个应用程序中 100% 的方法必须至少有一个标准的异常处理程序,使用 try/catch/finally 块;更复杂的方法还必须有针对特定异常的额外异常处理

  2. 所有控制流代码都可以选择性地写入“跟踪”信息,以在传统调试器不可用的情况下(例如,在登台和生产服务器上)帮助在运行时调试和检测应用程序。

(我不太了解这些标准,我来自java世界,java有两种异常,检查异常和未检查异常。开发人员必须处理已检查异常,并进行日志记录。关于未检查异常,可能还是要记录,但大多数时候我们只是扔掉它。然而到了 C#,我该怎么办?)

问题的问题:

  1. 列出您将为开发团队遵循的规则,以及您执行规则以实现这些目标的方式。

  2. 您将如何确保所有现有代码都符合产品架构师指定的规则?尤其是,哪些考虑因素会影响您为确保所有现有代码都遵守而制定的工作计划?

【问题讨论】:

  • 如果你问我,目标 1 是一个很大的 WTF。如果你不能对异常做任何有用的事情,不要试图捕捉它。充其量,用一些额外的信息记录异常并重新抛出它。
  • @Kyle - 不......我正在阅读一些在线书籍,他们使用面试问题作为消费税,这就是为什么我对阅读它们很感兴趣......如果我没有错,这应该成为面试题之一...
  • “整个应用程序中100%的方法必须至少有一个标准的异常处理程序,使用try/catch/finally块”......请不要这样做......

标签: c# exception-handling bug-tracking


【解决方案1】:

正如您提到的,Java 有检查和未检查的异常。对于已检查的异常,您必须声明您的方法抛出它,或者在方法中处理异常。 C# 没有这个限制,你的方法不必声明它可能抛出什么异常。

整个应用程序中 100% 的方法必须至少有一个标准的异常处理程序,使用 try/catch/finally 块;更复杂的方法还必须有针对特定异常的额外异常处理

这似乎是一个愚蠢的要求。如果您没有有意义的方法从异常中恢复并继续正常执行,那么理想情况下,您会允许异常不受阻碍地在堆栈中冒泡。这样,当您记录异常时(就在优雅地关闭之前,或者不是那么优雅地关闭之前),您将获得关于究竟是什么导致异常的完整堆栈跟踪。使用pokemon exception handling 并过早记录异常是一个非常常见的错误(从我看到的代码来看)(所以你知道发生了一些不好的事情,但不知道是哪段代码触发了它。


您还应该查看this list of similar question,以全面了解良好的异常处理实践。

为了更好的衡量Vexing exceptions。

【讨论】:

    【解决方案2】:

    定义应用程序架构后,您应该确定如何处理应用程序生成的异常。该策略应满足所有安全、隐私和性能要求。以下是异常处理策略的一般准则:

    • 除非可以添加某种值,否则不要捕获异常。换句话说,如果知道异常对用户、您或应用程序没有用处,请不要捕获它。
    • 如果您想重试操作、向异常添加相关信息、隐藏异常中包含的敏感信息或显示格式化信息,请务必捕获异常。
    • 通常,仅在应用程序边界(例如逻辑层、层、服务边界或 UI 层的顶部)处理异常。此外,将包含敏感信息的异常替换为包含可以在当前边界之外安全公开的信息的新异常。
    • 不要跨信任边界传播敏感信息。这是一个标准的安全考虑,但在处理异常信息时经常被忽略。相反,将包含敏感信息的异常替换为包含可以安全地暴露在当前边界之外的信息的新异常。
    • 使异常尽可能准确,并允许在引发异常时采取特定操作。有时这可能需要编写具有所需属性的自定义异常。
    • 显示给用户的错误消息应该是相关的,并且应该建议采取纠正措施。在大多数情况下,用户显示的错误消息不应包含敏感信息,例如堆栈跟踪或服务器名称。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 2017-05-08
      • 1970-01-01
      • 2021-06-16
      • 2023-03-14
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多