在csharp中捕获未处理的异常

本文关键字:未处理 异常 csharp | 更新日期: 2023-09-27 18:19:30

我在发布模式下得到一个NullReferenceException,但在调试模式下没有。为了查找错误,我添加了一个UnhandledException处理程序,但该异常不会发送到该处理程序。

没有gui代码,它只是控制台。

程序退出,并显示消息:System.NullReferenceException:对象引用未设置为对象的实例。

需要明确的是,我根本没有在调试模式下得到它,我只有在控制台以发布模式运行时才能得到它,所以我无法调试它来找到问题所在。

为什么设置AppDomain.CurrentDomain.UnhandledException无效?

static void errhandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    Console.WriteLine(e.StackTrace + ' ' + e.ToString());
    System.Environment.Exit(1);
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Flags = System.Security.Permissions.SecurityPermissionFlag.ControlAppDomain)]
static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(errhandler);
        try
        {
            new test(args[0], args[1]);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace + ' ' + e.ToString());
        }
}

在csharp中捕获未处理的异常

为了处理所有异常,我们使用以下方法:

    private static void SetupExceptionHandling()
    {
        // Add the event handler for handling UI thread exceptions to the event.
        Application.ThreadException += ApplicationThreadException;
        // Set the unhandled exception mode to force all Windows Forms errors to go through our handler.
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        // Add the event handler for handling non-UI thread exceptions to the event.
        AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;
        //  This AppDomain-wide event provides a mechanism to prevent exception escalation policy (which, by default, terminates the process) from triggering.
        //  Each handler is passed a UnobservedTaskExceptionEventArgs instance, which may be used to examine the exception and to mark it as observed.
        TaskScheduler.UnobservedTaskException += TaskSchedulerUnobservedTaskException;
        // Add the event handler for handling UI thread exceptions to the event.
        Dispatcher.CurrentDispatcher.UnhandledException += DispatcherUnhandledException;
    }

我希望它能帮助你。

您的代码是正确的。证明:

static void errhandler(object sender, UnhandledExceptionEventArgs args)
{
    Console.WriteLine("Errhandler called");
    Exception e = (Exception)args.ExceptionObject;
    Console.WriteLine(e.StackTrace + ' ' + e.ToString());
    System.Environment.Exit(1);
}
public static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(errhandler);
    string s = null;
    s.ToString();
}

打印"调用了错误处理程序"。

因此,你的问题在其他地方。

为什么不在代码中放入try-catch块?

像这样:

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Flags = System.Security.Permissions.SecurityPermissionFlag.ControlAppDomain)]
    static void Main(string[] args)
    {
        try
        {
            new test(args[0], args[1]);
        }
        catch(Exception e)
        {
            Console.WriteLine(e)
        }
    }

或者您需要使用事件处理程序?