2

我有一个用 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 控制台应用程序中的全局异常处理程序

c# 中的全局异常处理(控制台应用程序)

4

3 回答 3

3

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

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

您想捕捉除以 0 异常吗?您是否要检查该异常发生的位置,以便仅捕获自己的错误。或者,当其他人的代码抛出除以 0 异常时,您盲目地忽略是否可以?

即使你做到,当异常发生时你会怎么做?这不像你可以跳回原来的位置并继续。堆栈已展开,所有上下文都丢失了。

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

于 2013-03-17T12:47:20.090 回答
1

我认为您可以使用try catch以下块解决它:-

  try { 
     int zero = 0; 
     int i = 10 / zero; 
     } 
  catch (DivideByZeroException) 
   {
   }
于 2013-03-17T12:20:27.387 回答
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;
}
于 2013-03-17T12:21:33.160 回答