在csharp

时间:2015-10-28 07:26:47

标签: c#

我在发布模式下收到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());
        }

}

3 个答案:

答案 0 :(得分:3)

为处理所有异常,我们使用:

    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;
    }

我希望,它可以帮助你。

答案 1 :(得分:0)

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

-(void) saveFloatValue:(float)x forKey:(NSString *)key {
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setFloat:x forKey:key];
    [userDefaults synchronize];
}

打印“Errhandler”。

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

答案 2 :(得分:0)

为什么不在代码中放一个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)
        }
    }

或者你需要使用Eventhandler吗?