我有一个 WPF 应用程序,每当我的应用程序遇到未处理的异常以帮助调试时,我都需要编写一个小型转储文件。但是,每次调用异常处理程序时,堆栈都会完全展开到处理程序,并且在转储文件中没有可以使用的有用状态。
II 尝试订阅这两个,并且堆栈都为它们展开:
Application.Current.DispatcherUnhandledException
AppDomain.CurrentDomain.UnhandledException
我对控制台应用程序进行了同样的尝试,但堆栈没有展开,所以它肯定与 WPF 相关。异常和处理程序都发生在主线程中。
这里有 2 个代码示例,您可以轻松查看。只需在每个处理程序中设置断点,并在遇到断点时观察调用堆栈。
控制台应用程序:
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
int foo = 5;
++foo;
throw new ApplicationException("blah");
++foo;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("blah");
}
}
WPF 应用程序:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
Application.Current.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
int foo = 5;
++foo;
throw new ApplicationException("blah");
++foo;
base.OnStartup(e);
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {}
void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = false;
}
}