General Exception Handling Strategy for .NET

后端 未结 11 1491
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-15 08:51

I’m used to having try/catch blocks in every method. The reason for this is so that I can catch every exception at the point of infraction and log it. I understand, from my

11条回答
  •  星月不相逢
    2020-12-15 09:25

    I definitely don't use a try catch wrapper around every method (oddly enough, I did when I first started but that was before I learned better ways).

    1) To prevent the program from crashing and the users losing their info, I do this

                    runProgram:
                    try
                    {
                        container.ShowDialog();
                    }
                    catch (Exception ex)
                    {
                        ExceptionManager.Publish(ex);
                        if (MessageBox.Show("A fatal error has occurred.  Please save work and restart program.  Would you like to try to continue?", "Fatal Error", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            goto runProgram;
                        container.Close();
                    }
    

    container is where my application starts so this basically puts a wrapper around my entire app so that nothing causes a crash that can't be recovered. This is one of those rare instances where I don't really mind using a goto (it is a small amount of code and still quite readable)

    2) I only catch exceptions in methods where I expect something could go wrong (such as a timeout).

    3) Just as a point of readibility, if you have a try catch block with a bunch of code in the try section and a bunch in the catch section, it is better to extract that code to a well named method.

       public void delete(Page page) 
       {
          try 
          {
             deletePageAndAllReferences(page)
          }
          catch (Exception e) 
          {
             logError(e);
          }
       }
    

提交回复
热议问题