为什么那个异常管理代码会发臭?

时间:2012-10-05 08:19:16

标签: c# exception exception-handling

为什么不建议(以最佳实践意义)从入口点管理系统的所有异常。

class Program
    {
        static void Main(string[] args)
        {
              try
              {
                 [...]//all the program stuff
              }catch(Exception ex)
              {
                    [...]
              }
        }
    }

编辑 在第二点,它是否会改变表演的某些内容?

2 个答案:

答案 0 :(得分:5)

我们不建议您应该在可以以有用的方式实际处理它们的地方捕获异常

如果您无法对异常做任何事情但崩溃,那么您的解决方案可以正常工作,但请考虑一个丢失的文件,它会给您一个例外。您是希望使用“OpenFile”方法中的对话框处理它(或者在这种情况下可能是您打开文件的方法的一部分)并且可能让用户有机会在继续之前浏览文件所在的位置,或者你宁愿把它扔回main并没有真正的选择,除了“log and crash”?

答案 1 :(得分:1)

这种方法:

  • 并不强调在正确的地方捕捉预期的例外情况,即可以在相同的情况下处理它们。
  • 不会在另一个线程上捕获异常,因此它不会在多线程环境中工作。
  • 无法捕获许多Windows窗体异常,因为它们被.NET Framework拦截。
  • 吞下每个异常,除非进程已损坏。这不是一个好方法,因为当你不理解它时,你不应该吞下一个例外。

更好的方法是在特定于上下文的方法中捕获预期的异常,在这些方法中,可以使用最多的知识来正确处理它们。要捕获意外的异常,您的Main方法可能如下所示:

// Event handler for handling all UI thread exceptions.
Application.ThreadException += 
    new ThreadExceptionEventHandler(App_UiThreadException);

// Force all Windows Forms errors to go through our handler.
// NB In .NET 4, this doesn't apply when the process state is corrupted.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Event handler for handling all non-UI thread exceptions. 
AppDomain.CurrentDomain.UnhandledException += new 
    UnhandledExceptionEventHandler(App_NonUiThreadException);

// Run the application.