WPF出现奇怪的未处理异常

本文关键字:未处理 异常 WPF | 更新日期: 2023-09-27 17:58:43

我有一个WPF应用程序,我用它询问用户一些连接到数据库的设置,然后我连接到数据库(使用NHibernate),如果一切正常,我会显示我的主视图。如果连接中有错误,我想告诉用户错误是什么,然后让他重试。这里有一些简化的代码,可以做我想做的事情:

编辑:

问题似乎不仅仅出在NHibernate身上。如果我只是在这里运行简单的应用程序,我会在构造函数中得到未处理的异常。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        bool retry;
        do
        {
            retry = false;
            Window1 view = new Window1();
            try
            {
                throw new Exception("Test message");
                view.ShowDialog();
            }
            catch (Exception iException)
            {
                MessageBox.Show(iException.ToString());
                retry = true;
            }
            finally
            {
                view.Close();
            }
        }
        while (retry);
    }
}

我确实得到了未处理的异常,它给了我测试消息,所以它确实是我的异常(即使它在try/catch块内)。如果我在得到异常时中断,它会"告诉"我它发生在Window1的构造函数内。Window1不包含任何绑定或控件。如果您在visualstudio2008中创建一个新的WPF应用程序,它只是基本的Window1。我在2台计算机上复制了这个错误(只需创建一个新的WPF应用程序并将此代码粘贴到App.xaml.cs中)

感谢大家的帮助

WPF出现奇怪的未处理异常

我只创建了一次窗口(在循环之前)就解决了这个问题。而不是在finally块中关闭它,我调用Hide,并且只在循环之后关闭它。

可能会发生任意数量的异常,如果不公布异常详细信息,很难进行诊断。

如果让我猜的话,我的猜测就是那个观点。Close()正在投掷,因为你说它没有被抓住。

尝试在catch语句中调用session.clear()。

Nhibernate将继续缓冲SQL,直到它写入数据库(刷新)。如果您有问题(异常),它不会在异常发生时抛出,而是在会话被刷新时(当它试图将SQL写入数据库时)抛出。

发布NHibernate异常后,我可能会偏离这一点。。

您只需要构建一个会话工厂和一个配置ONCE。它可以是全局对象。然后,每次通过循环,让会话工厂启动一个会话。由于您从未破坏会话工厂,因此构建另一个会话工厂将使nhibernate陷入困境,因为它只需要一个具有一种配置的会话工厂。

我认为WPF运行时还没有准备好在OnStartup()方法期间创建窗口。该方法通常用于初始化应用程序的上下文。初始窗口通常指定为App.xaml.中标记中的StartupUri

尝试重构代码,让运行时使用StartupUri创建Window1()。

使用您的代码,我从窗口中获得"System.InvalidOperationException:应用程序对象正在关闭"-这似乎是正确的异常。在加载资源时,应用程序会通知窗口在完成实例化之前关闭。

解决问题的方法是等待窗口的创建,直到您知道在启动时没有出现异常。

你也可以更改你的finally部分,改为调度关闭,这样窗口初始化就会在你关闭之前完成——我会尝试加载dispatcherpriority。

如果您在发布版本中运行,您将获得永不结束的循环。