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