【问题标题】:C# - How to structure error handling in code properly [closed]C# - 如何在代码中正确构建错误处理[关闭]
【发布时间】:2014-05-13 15:33:27
【问题描述】:

我对编程相当陌生,我想知道构建错误处理的正确方法是什么。我已经搜索了互联网,但我没有找到关于所有 try/catch/finally 语句的结构以及它们如何相互交互的可靠信息。

我想提出我的想法,我认为我应该如何在代码中构建我的错误处理,我想邀请大家检查这是否正确。一个很大的好处是通过其他一些研究来支持它,这是某种常见的做法。

所以我这样做的方法是在几乎所有地方都放置 try 语句! (我希望我这样说没有激怒所有人)。 PS - 我也了解捕获不同类型的异常,我只是为了解释目的而捕获类型“异常”。

例如:

  1. 我在普通控制台应用程序中从 Main 开始,然后创建一个 A的实例。

  2. 然后我在其上调用一个名为 AMethod1 (a.AMethod1) 的成员函数。

  3. A.AMethod1 创建类 B 的实例,然后调用 BMethod1 (b.BMethod1)。

这就是我将如何处理错误:

    public class Program
    {
       static void Main (string[] args)
       {
          //I do not place simple code like below inside the try statement, 
          //because it is unnecessary and will slow the process down.
          //Is this correct?

          const int importantNumber = 45;
          string name;
          IRepositoryFactory repoFactory;
          A a; 

          //And then I put code in 'try' where I feel it may go wrong.
          try
          {
             a = new A();
             a.AMethod1();

             //Some other code    
          }
          catch (Exception ex)
          {
             HandleError(ex);
          }
       }
    } 
    // End of scope of Program! The functions below belong to their relative 
    // classes.

    public void AMethod1()
    {
       try
       { 
          B b = new B();
          b.BMethod1(); 
       }
       catch (Exception ex)
       { 
          //Preserving the original exception and giving more detailed feedback.
          //Is this correct?
          //Alternative - you still could do a normal 'throw' like in BMethod1.
          throw new Exception("Something failed", ex); 
       }
    }

    public void BMethod1()
    {
       try
       { 
          //some code 
       }
       catch (Exception ex)
       { 
          throw; //So I don't lose stack trace - Is this correct?
       }
    }

总结:

  1. 我把所有代码都放在了 try 语句中(除了 以上代码)
  2. 在客户端级别(在调用堆栈的开头)我 捕捉错误并处理它。
  3. 向下调用堆栈,我只是 抛出异常,这样我就不会破坏堆栈信息。

我非常感谢一些资源,这些资源解释了程序员是如何构建他们的错误处理的。请不要忘记阅读代码中的 cmets。

【问题讨论】:

标签: c# exception-handling structure


【解决方案1】:

这里有一些好的经验法则:

  1. 如果您要在相关级别记录错误,请使用异常处理
  2. 如果有办法解决异常,请使用异常处理
  3. 否则,不要在该级别添加任何异常处理

上述规则的例外是 UI 应该始终(好吧,也许并不总是,但我想不出这个规则的例外)有异常处理。

一般来说,如果您抛出与代码中相同的错误,则表明您不应处理该异常。故事结束。

注意:当我说“在那个级别”时,我的意思是在单个类或方法中。除非异常处理增加了价值,否则不要包含它。它总是在用户界面级别增加价值,因为用户不必看到你的脏衣服,一条消息说“哎呀,洗衣日”就足够了。

【讨论】:

  • 您能否继续扩展:'一般来说,如果您抛出与代码中相同的错误,则表明您不应处理异常。故事结束' - 不明白为什么这是一个问题。
【解决方案2】:

根据我的个人经验,大多数异常都与空对象引用有关。我倾向于遵循空对象模式以避免大量检查空值。而且在进行值转换时,我总是使用 tryparse,这样我就不会遇到 null 问题。总而言之,这个主题可以从多个角度进行讨论。如果你能更具体一点,那将很容易回答。

【讨论】:

  • 同意安全编码解决了许多问题。检查空值,尝试解析而不是解析(除非您收到一个非数字字符串是应该抛出的异常以显示开发人员搞砸了?)。但这里的核心问题是关于异常处理模式。
【解决方案3】:

stackoverflow 真的不是意见网站。它主要针对特定​​问题的特定答案。

但您应该知道try...catch 确实有一些与之相关的开销。将它放在“任何地方”都会损害代码的性能。

只需使用它来包装会出现意外错误的代码,例如写入磁盘。

另请注意,“正确”的方法取决于您对这些错误的处理方式。您是否正在记录它们,将它们报告给用户,将它们传播给调用者?这取决于。

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2019-03-20
    相关资源
    最近更新 更多