C# - 如何正确构造代码中的错误处理

时间:2014-05-13 15:33:27

标签: c# exception-handling structure

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

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

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

例如:

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

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

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

  4. 这就是我处理错误的方法:

        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. 在客户端级别(在调用堆栈的开头)I 抓住错误并处理它。
    3. 走下电话堆栈,我只是 抛出异常,所以我不打破堆栈信息。
    4. 我真的很感激一些解释程序员如何构建错误处理的资源。请不要忘记阅读代码中的注释。

3 个答案:

答案 0 :(得分:1)

以下是一些好的经验法则:

  1. 如果要在相关级别记录错误,请使用异常处理
  2. 如果有某种方法可以解决异常,请使用异常处理
  3. 否则,请勿在该级别添加任何异常处理
  4. 以上规则的例外情况是UI应该总是(好吧,也许并不总是,但我不能想到这个规则的例外),有异常处理。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

stackoverflow真的不是一个意见网站。它特别针对具体问题的具体答案。

但是你应该知道try...catch确实有一些与之相关的开销。把它放在任何地方"会损害你的代码的性能。

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

另请注意"正确"方式取决于你对这些错误的处理方式。您是否正在记录它们,将它们报告给用户,并将它们传播给呼叫者?这只是取决于。