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

C#-如何正确构造代码中的错误处理,c#,exception-handling,structure,C#,Exception Handling,Structure,我对编程相当陌生,我想知道构建错误处理的正确方法是什么。我在互联网上搜索过,但是我没有找到关于你所有try/catch/finally语句的结构以及它们之间如何相互作用的可靠信息 我想介绍一下我认为应该如何在代码中构造错误处理的想法,我想请大家检查一下这是否正确。一个巨大的好处是可以用一些其他的研究来支持它,这是某种常见的做法。 所以我这样做的方法就是把try语句放在几乎所有的地方!(我希望我的话没有激怒所有人)。PS-我也了解捕捉不同类型的异常,我只捕捉“Exception”类型只是为了解释

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

我想介绍一下我认为应该如何在代码中构造错误处理的想法,我想请大家检查一下这是否正确。一个巨大的好处是可以用一些其他的研究来支持它,这是某种常见的做法。

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

例如:

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

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

  • A.AMethod1创建类B的实例,然后调用BMethod1 (b.b方法1)

  • 下面是我处理错误的方法:

        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?
           }
        }
    
    总之:

  • 我将所有代码放在try语句中(除了如中所示的声明) (以上代码)
  • 在客户端级别(在调用堆栈的开始处)I 捕捉错误并处理它
  • 在调用堆栈中,我只是 抛出异常,这样我就不会破坏堆栈信息

  • 如果能提供一些资源来解释程序员应该如何组织他们的错误处理,我将不胜感激。请不要忘记阅读代码中的注释。

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

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

  • 如果要在相关级别记录错误,请使用异常处理
  • 如果有办法解决异常,请使用异常处理
  • 否则,不要在该级别添加任何异常处理
  • 上述规则的例外是UI应该总是(好的,也许不总是,但我不能马上想到这个规则的例外)有异常处理

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


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

    stackoverflow实际上不是一个意见网站。它主要针对特定问题的具体答案

    但是您应该知道,
    try…catch
    确实有一些开销与之相关。把它放在“任何地方”都会影响代码的性能

    只需使用它来包装易发生意外错误的代码,例如写入磁盘


    还要注意,“正确”的方法取决于您如何处理这些错误。您是否记录它们、向用户报告它们、向调用者传播它们?这取决于。

    可能重复的
    catch
    块不是免费的。只有当您想对异常执行一些有用的操作(例如,在重新刷新它们之前记录它们)时,才应该捕获异常。否则,就让它们传播到调用者可以重新抛出,
    抛出新异常(..)
    可以添加更多信息和重新抛出。你唯一不想做的就是抛出ex,这会吹走堆栈跟踪。同意安全编码可以解决许多问题。检查空值,尝试解析而不是解析(除非您收到的非数字字符串是一个异常,应该抛出该异常以显示开发人员出错?)。但这里的核心问题是关于异常处理模式的,你能不能进一步说:“一般来说,如果你抛出了与代码中相同的错误,这表明你不应该处理异常。故事结束”-不理解为什么这是一个问题。