在.NET中,我们使用try-catch-finally来处理异常。但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩溃了。

这些异常往往是你没有注意到的。在WPF中,提供了一种处理这些个异常的方式。

举例来说明。

1.先抛出个异常,不用try包围它。

在MainWindow上添加一个如下的Button。

<Window x:Class="HandlingAnUnhandledException.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><StackPanel><Button Click="OnClick"><Button.Template><ControlTemplate><Grid><Ellipse Height="100" Width="250" Fill="Pink"/><TextBlock Text="Button to Throw Exception by DebugLZQ" VerticalAlignment="Center" HorizontalAlignment="Center"/></Grid></ControlTemplate></Button.Template></Button></StackPanel>
</Window>

在Button的Click事件中抛出个异常

        private void OnClick(object sender, RoutedEventArgs e){throw new InvalidOperationException("Something has gone wrong.");}

如果,我们Ctrl+F5运行这个程序,点击按钮,程序就崩溃了。
WPF如何解决这个问题呢?

2.WPF处理这种异常的方法

在App.xaml.cs中订阅DispatcherUnhandledException事件,并添加相应的事件处理。

App.xaml.cs如下:

    public partial class App : Application{public App(){DispatcherUnhandledException += App_DispatcherUnhandledException;}void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){            MessageBox.Show("Error encountered! Please contact support."+ Environment.NewLine + e.Exception.Message);//Shutdown(1);e.Handled = true;}}

这时,当我们Ctrl+F5运行程序。

这样,异常就被捕获并处理了,程序没有崩溃。

Update:刚百度了一下:WinForm也有类似的机制,请参考Kevin Gao的这篇博文:C# winform 捕获全局异常.

 Update

  所有 WPF 应用程序启动时都会加载两个重要的线程:一个用于呈现用户界面,另一个用于管理用户界面。呈现线程是一个在后台运行的隐藏线程,因此我们通常面对的唯一线程就是 UI 线程。

  这种方法只能捕捉UI线程的异常,及使用了Dispatcher进行线程关联了的线程(其实Dispatcher.Invoke/BeginInvoke就是将要执行的代码,扔到UI线程去执行)的异常。不能捕捉普通的子线程异常。

如:

private void OnClick(object sender, RoutedEventArgs e)
{Dispatcher.BeginInvoke(new Action(() => { throw new InvalidOperationException("Something has gone wrong."); }));
}

也可以正常捕获。

而:

private void OnClick(object sender, RoutedEventArgs e)
{Thread t = new Thread(() => { throw new InvalidOperationException("Something has gone wrong."); });t.IsBackground = true;t.Start();
}

则不能捕获。

感谢veboys博友的指点~

------------------------------------------

同样的,即使我们用一个try-catch包围如下的异常,异常也不会被Handle:

try
{var thread = new Thread(() => {throw new Exception(); });thread.Start();
}
catch (Exception)
{MessageBox.Show("Will not execute!");throw;
}

try
{Task.Run(() =>{throw new Exception(); });
}
catch (Exception)
{MessageBox.Show("Will not execute!");
}

--------------

对应Async await 异常:

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e){try{await Task.Run(() => { throw new Exception(); });}catch (Exception){MessageBox.Show("Will execute!");}}

处理Unhandled exception异常 如下:TaskScheduler.UnobservedTaskException

    public partial class App : Application{protected override void OnStartup(StartupEventArgs e){RegisterEvents();base.OnStartup(e);}private void RegisterEvents(){TaskScheduler.UnobservedTaskException += (sender, args) =>{MessageBox.Show(args.Exception.Message);args.SetObserved();};AppDomain.CurrentDomain.UnhandledException += (sender, args) => MessageBox.Show("Unhandled exception.");}}

 Update

WPF程序的异常捕获总结

转载于:https://www.cnblogs.com/DebugLZQ/p/3161185.html

WPF整理-处理没有注意到的异常相关推荐

  1. WPF整理-使用逻辑资源

    WPF整理-使用逻辑资源 原文:WPF整理-使用逻辑资源 "Traditional application resources consist of binary chunks of dat ...

  2. WPF整理-为User Control添加依赖属性

    WPF整理-为User Control添加依赖属性 原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more t ...

  3. WPF整理-使用ResourceDictionary管理Logical Resources

    原文:WPF整理-使用ResourceDictionary管理Logical Resources "Logical resources may be of various types, su ...

  4. 干!一张图整理了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  5. staticextension 上提供值时引发了异常_干!一张图整理了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  6. python时间减法_干!一张图整理了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  7. python错误代码提示手册_腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册...

    ↑关注 + 星标 ,每天学Python新技能后台回复[大礼包]送你Python自学大礼 在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常 ...

  8. VS WPF 整理XAML代码

    工具-选项-文本编辑器-XAML-格式化-间距 设置如下即可 其他的选择参考:http://blog.sina.com.cn/s/blog_64461e2a0101egd7.html

  9. slice_input_producer在2.0版本里怎么用_微信提醒对方账号异常应该怎么办

    微信提醒对方账号异常?平常我们在操作微信时,哪些行为会被界定为操作异常呢?简单的讲,就是用户一般不会去做的行为就会被界定为操作异常,下面是整理的微信提醒对方账号异常教程,一起去看看吧! 微信提醒对方账 ...

最新文章

  1. 5.2 FIR滤波器的卷积(脉冲响应、频率响应,幅频响应,暂态-搞不清楚的有救了啊)
  2. Python常用正则表达式总结
  3. boost::mpl模块AUX_ASSERT_IS_SEQ的测试程序
  4. iphone3G恢复到3.1.2遇到的问题
  5. c# java 哪个好 流媒体_C#Net7mma H264 / PCMU流媒体
  6. uestc summer training #2
  7. 作者:杜克明(1980-),男,中国农业科学院农业环境与可持续发展研究所助理研究员。...
  8. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
  9. Flink Forward Asia 2019 - 总结和展望(附PPT下载链接)
  10. QCC3024/QCC3034/QCC3020/QCC3021/QCC3031 USB AUDIO USB声卡 双向动态切换功能
  11. Form表单 jQuery 文件上传
  12. 数据安全法整理学习笔记
  13. c语言标志位flag怎么用,怎么用flag标志位当单片机中断标志来用
  14. MacBook入门之——添加打印机
  15. LeNet识别眼疾iChallenge-PM
  16. spark-streaming 编程(一)构建开发环境
  17. PrecompiledAssemblyException: Multiple precompiled assemblies with the same name websocket-sharp.dll
  18. Java后端面试(四)
  19. HTML/CSS学习笔记(1)
  20. 使用Packer 在 VMware vSphere 上构建 Redhat/CentOS 虚拟机

热门文章

  1. Java设计模式(学习整理)---策略模式
  2. 基于nginx环境部署nagios
  3. Ajax搜索结果页面下方的分页按钮的生成
  4. OMNet++ 4.0
  5. 博客园T恤内部泄漏版(附图)
  6. Linux Shell常用技巧(五)
  7. android SharedPreferences的使用优化
  8. iPhone4 FaceTime 联通官方教程
  9. django crm 03
  10. 为什么vue前端项目要使用nodejs