在try-catch或代码的特定部分中包装每个方法

时间:2015-09-04 09:27:39

标签: c# try-catch

我的高级同事告诉我在try-catch块中包装每个方法,以便他们可以跟踪异常发生的位置,以帮助更快地调试问题。最好将Try Catch中的每个方法包装到:

Public int foo()
{
   try
   {
       //do something
   }catch(Exeception ex)
   {
       //do something with ex
   }
}

或者在我认为可能发生的情况下捕获异常更好吗?例如。对数组做某事可能会导致IndexOutOfRangeException发生。

//wrap this in try catch
    int[] array = new int[3];

                array[0] = 1;
                array[1] = 2;
                array[2] = 3;
                array[3] = 4;

感谢。

5 个答案:

答案 0 :(得分:8)

try块包含可能导致异常的受保护代码。执行该块直到抛出异常或成功完成。

您可以查看How often should I use try and catch

捕获异常的基本经验法则是,当且仅当您有一种有意义的处理方式时才捕获异常。

如果您只是要记录异常并将其抛出堆栈,请不要捕获异常。它没有任何意义和杂乱的代码。

如果您希望代码的特定部分出现故障,并且有后备支持,请捕获异常。

当然,您总是遇到需要使用try / catch块的已检查异常的情况,在这种情况下您没有其他选择。即使检查了异常,也要确保正确记录并尽可能干净地处理。

答案 1 :(得分:0)

最好在代码的关键部分使用它,然后:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    ServerForm form = new ServerForm();
    Application.Run(form);
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    MessageBox.Show(e.Exception.Message, Program.Name);
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show((e.ExceptionObject as Exception).Message, Program.Name);
}

只是在未处理的异常

的情况下

答案 2 :(得分:0)

使用Try catch块没有问题,因为它没有开销(除非你在任何地方继续添加它可能包括可读性开销),而且当没有异常被抛出时,通常会为catch和finally块添加额外的IL。行为几乎没有差异。

但是,如果您的代码确实抛出异常,那么就会出现轻微的性能问题,因为在这种情况下必须创建异常,必须放置堆栈爬行标记,并且如果处理异常并访问其StackTrace属性,则栈行走是招致的。因此总是将代码包装在try catch块中可能不是一个好主意,或者你可以将它放在父级别,然后检查堆栈跟踪

答案 3 :(得分:0)

使用try-catch在很大程度上取决于上下文。 对我来说,在使用或不使用try catch块时,没有规则告诉开发人员。

开发人员代码必须防止由于空参数或文件存在或数据一致性等上下文导致的明显错误或异常。 在开发许多其他程序使用的库的情况下,库只捕获一些关键异常,以允许顶级程序提供有关错误和异常的更多详细信息。

例如,我们在库中使用System.IO.File.WriteAllLines。

void bool DoSomethingWithFile()
{
  try
  {
     // Some code here
     System.IO.File.WriteAllLines()
     //some code here
     return true;
  }
  catch()
  {
     LogExeption();
     return false;
  }
}

如何告诉顶级程序PathTooLongException或者除非你在catch块中添加throw,否则会出现安全异常。

答案 4 :(得分:-2)

您认为可能发生错误的每一段代码都应该包含在try catch块中。如果您正在处理一些实时问题和应用程序,您应该在任何地方使用它。这是一个很好的编程实践。如果您不知道可能发生什么异常,只需使用catch块来解决一般异常:

try
{
   //your code
}
catch (Exception ex)
{
   //exception handling
}

或者您可以使用:

try
{
   //your code
}
catch
{
   //your custom message
}