控制台应用程序中的非终止全局异常处理程序

时间:2013-03-17 12:18:05

标签: c# exception-handling console

我有一个用C#代码编写的控制台应用程序。我们假设它是最简单的应用程序,就像 Hello World 示例:

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += 
              CurrentDomain_UnhandledException;
        int zero = 0;
        int i = 10 / zero;
    }

    static void CurrentDomain_UnhandledException(
                  object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("exception");
    }
}

但是,我想在全局异常处理程序中处理DevideByZero异常,但不通过Environment.Exit()退出应用程序。

有可能吗?怎么样?

注意:

我已经看过这些问题,但它们都已经终止了。异常会一次又一次地被提出。

.NET Global exception handler in console application

Global exception handling in c# (console application)

3 个答案:

答案 0 :(得分:3)

这是一个非常糟糕的想法,如果故意让它变得非常困难或无法完成,我不会感到惊讶。

如果调用Unhandled异常处理程序,则根据定义,您的程序处于未知且最可能已损坏的状态。唯一合理的做法是在记录错误并且可能尝试保存任何关键数据后,尽快终止程序。即便这样也存在风险,因为错误可能发生在记录器中......或者在正常关机期间保存数据。

你想要除以0除外吗?你打算检查发生异常的 where ,以便你只捕获自己的错误。或者,当你别人的代码抛出除以0的异常时,你是否可以盲目地忽略它?

即使你可以这样做,当发生异常时你打算做什么?这不像你可以跳回原来的地方继续。堆栈已经解开并且所有上下文都丢失了。

你不想这样做。真。编写代码,使其不会除以0.或者使用try / catch。这就是它的用途。

答案 1 :(得分:1)

我认为你可以使用try catch块来解决它: -

  try { 
     int zero = 0; 
     int i = 10 / zero; 
     } 
  catch (DivideByZeroException) 
   {
   }

答案 2 :(得分:0)

试试这个(也为'Application.ThreadException'添加一个处理程序):

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += 
          CurrentDomain_UnhandledException;

    Application.ThreadException +=
     new System.Threading.ThreadExceptionEventHandler(
                Application_ThreadException);

   Application.SetUnhandledExceptionMode(
     UnhandledExceptionMode.CatchException);

    int zero = 0;
    int i = 10 / zero;
}