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

本文关键字:代码 定部 try-catch 方法 包装 | 更新日期: 2023-09-27 18:11:05

我的高级同事告诉我将每个方法包装在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;

谢谢。

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

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

你可以看看我应该多久使用一次try and catch

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

如果你只打算记录异常并把它扔到堆栈中,就不要捕捉异常。它没有任何意义,使代码混乱。

当你预期在代码的特定部分出现错误时,如果你有一个回退,请捕获一个异常。

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

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

[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);
}

只是在未处理的情况下

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

然而,如果你的代码抛出一个异常,这是你有一个轻微的性能问题,因为在这种情况下,必须创建一个异常,堆栈爬行标记必须放置,如果异常被处理和它的StackTrace属性访问,堆栈遍历发生。因此,它可能不是一个好主意,总是包装你的代码在try catch块或者你可以把它放在父级,然后检查堆栈跟踪

是否使用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。

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

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

或者你可以使用:

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