如何处理WPF应用程序实例化期间抛出的异常?
问题描述:
我用下面的代码显示未处理的WPF应用程序异常:如何处理WPF应用程序实例化期间抛出的异常?
public MyApplication() {
this.DispatcherUnhandledException += (o, e) => {
var exceptionMessage = new ExceptionWindow();
exceptionMessage.ExceptionMessage.Text = e.Exception.Message;
exceptionMessage.ExceptionCallStack.Text = e.Exception.StackTrace;
exceptionMessage.ExceptionInnerException.Text = e.Exception.InnerException.Message;
exceptionMessage.WindowStartupLocation = WindowStartupLocation.CenterScreen;
exceptionMessage.WindowStyle = WindowStyle.ToolWindow;
exceptionMessage.ShowDialog();
e.Handled = true;
Shell.Close();
};
}
证明,我有应用的实例化过程中的异常,所以永远不会执行应用程序的构造。
一个简单的方法来重现它(与一个不同的例外)是通过在你的应用程序的配置文件中的某个标记之前引入一个额外的“<”并运行它。
这样的无用的错误消息出现在应用程序构造函数被调用之前。 alt text http://srtsolutions.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mikewoelmer/ExceptionWPF1_5F00_1C1F39AA.jpg
有没有人知道如何捕捉这种例外?
备注:我使用的是Caliburn,我的应用程序扩展了CaliburnApplication。
答
好的。我通过以下操作解决了这个问题:
更改
App.xaml
文件的Build Action
从ApplicationDefinition
到Page
。创建一个新的类像下面:
public class AppStartup {
[STAThread]
static public void Main(string[] args) {
try {
App app = new App();
app.InitializeComponent();
app.Run();
}
catch (Exception e) {
MessageBox.Show(e.Message + "\r\r" + e.StackTrace, "Application Exception", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
它通过这一个替代产生App.g.cs Main方法,所以我们有机会捕捉到的异常。
只是出于好奇 - 为什么你想要捕捉异常?由于您的程序无效,您永远无法正常处理它。 – 2010-01-26 12:04:45
我的真正问题是FirebirdSql.Data.FirebirdClient.dll中的异常,这是由于配置文件中缺少一节。我已经解决了这个问题,但不容易识别异常,因为它不会在开发机器中发生。 我只是想确保没有给我足够的异常细节,没有其他异常会以这种方式抛出。 – 2010-01-26 12:40:32