相关疑难解决方法(0)

WPF ShowDialog在窗口加载期间吞咽异常

使用Window类中的ShowDialog方法显示WPF窗口对话框,就像在主窗口上按下按钮一样,如下所示.

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var window = new Window1();
                window.ShowDialog();
            }
            catch (ApplicationException ex)
            {
                MessageBox.Show("I am not shown.");
            }
        }
Run Code Online (Sandbox Code Playgroud)

该窗口在xaml中订阅了一个Loaded事件,如下所示:

<Window x:Class="Stackoverflow.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Loaded="Window_Loaded">
    <Grid />
</Window>
Run Code Online (Sandbox Code Playgroud)

Window_Loaded事件中抛出异常

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        throw new ApplicationException();
    }
Run Code Online (Sandbox Code Playgroud)

但是,ShowDialog调用周围没有捕获异常,调用也没有返回.吞下异常并仍然显示窗口.

为什么会发生这种情况?如何处理WPF窗口的Window_Loaded事件中的异常?我是否必须在事件处理程序中捕获它并手动处理窗口?

在WinForms中,您需要打电话 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)

为了让异常通过ShowDialog调用冒泡.是否需要在WPF上设置类似的开关?

wpf exception

12
推荐指数
1
解决办法
4869
查看次数

拦截C#中的所有异常,即使它们已被捕获

Visual Studio能够打破所有异常,即使它们被捕获.请注意CLR异常的"Thrown"下的复选框.检查时,throw即使catch调用堆栈中存在某个位置,调试器也会在每个语句上中断.

Visual Studio中的异常处理

有没有办法在代码中执行此操作?我在64位类库中使用.NET 4.5.1.我的目标是记录每个异常及其堆栈跟踪.这样,当我在没有Visual Studio的计算机上测试我的程序时,我会得到抛出异常的日志,甚至是我通过向用户显示对话框来处理的异常.我的程序是多线程的,因此它需要在任何线程中引发抛出异常的事件.

一种可怕的方法就是扩展Exception,将一些代码放在新类的构造函数中,并确保每个异常都扩展它.但是,这是不可行的,因为抛出的许多异常甚至不是我的代码而是CLR本身.

那么,关于如何引发或监听在抛出异常时引发的事件的想法,即使捕获该异常也是如此?我所见过的是各种捕捉未捕获异常的方法,这不是我想要的.

.net c# multithreading exception

4
推荐指数
1
解决办法
2579
查看次数

标签 统计

exception ×2

.net ×1

c# ×1

multithreading ×1

wpf ×1