在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());
}
}
为了处理所有异常,我们使用以下方法:
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)
}
}
或者您需要使用事件处理程序?