这是处理这两种情况的最佳方法吗?
public static class Program
{
//http://blogs.microsoft.co.il/blogs/arik/archive/2010/05/28/wpf-single-instance-application.aspx
//http://social.msdn.microsoft.com/forums/en-US/wpf/thread/dee46bde-9baa-46b6-889c-04e20dd04029
//http://msdn.microsoft.com/en-us/library/ms404228.aspx?appId=Dev10IDEF1&l=EN-US&k=k%28CS1058%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK&k=VERSION=V4.0%22%29&rd=true
[STAThread]
public static Int32 Main(string[] args)
{
bool unhandledInstalled = false;
try
{
AppDomain.CurrentDomain.UnhandledException += UnhandledException;
unhandledInstalled = true;
var app = new App();
app.DispatcherUnhandledException += DispatcherUnhandledException;
return app.Run();
}
catch (SecurityException)
{
// Notify
}
catch (Exception e)
{
var rwe = e as RuntimeWrappedException;
if (rwe != null)
{
object wrappedException = rwe.WrappedException;
MessageBox.Show(wrappedException.ToString());
}
if (unhandledInstalled)
throw;
// No handler has been installed but handle it anyway.
UnhandledException(null, new UnhandledExceptionEventArgs(e, true));
}
return -1;
}
private static void UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
MessageBox.Show(args.ExceptionObject.ToString());
Environment.Exit(-1);
}
private static void DispatcherUnhandledException(object sender,
DispatcherUnhandledExceptionEventArgs e)
{
// Do something here
e.Handled = true;
}
}
谢谢!
答案 0 :(得分:1)
Main()方法中的异常处理程序永远不会运行。 Dispatcher.UnhandledException处理程序将阻止app.Run()因异常而退出。您在事件处理程序中设置e.Handled = true。不要让它保持沉默,让用户知道kaboom的内容。
“unhandledInstalled”变量很奇怪。你安装了一个,它总是如此。如果代码在 try块之前崩溃,则没有理由尝试做一些有意义的事情,真的错误发生了。
答案 1 :(得分:0)
我认为我做对了,但我还是无法测试RuntimeWrappedException, 我刚刚发现DispatcherUnhandledException处理应用程序内部的所有内容,我认为它完全是针对Dispatcher.BeginInvoke()的东西。
谢谢,
[STAThread]
public static Int32 Main(string[] args)
{
try
{
AppDomain.CurrentDomain.UnhandledException += UnhandledException;
var app = new App();
app.DispatcherUnhandledException += DispatcherUnhandledException;
int run = app.Run();
return run;
}
catch (SecurityException)
{
// Notify & exit
}
catch (Exception e)
{
var rwe = e as RuntimeWrappedException;
if (rwe != null)
{
object wrappedException = rwe.WrappedException;
MessageBox.Show(wrappedException.ToString());
Environment.Exit(-1);
}
throw;
}
return -1;
}
private static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show(e.ExceptionObject.ToString());
Environment.Exit(-1);
}
private static void DispatcherUnhandledException(object sender,
DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show(e.Exception.ToString());
// Decide if we exit or not
// ...
e.Handled = true;
}