WPF程序中,对于异常的捕获一般使用try/catch块。就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获。如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失。WPF中提供了Application.DispatcherUnhandledException事件和AppDomain.UnhandledException事件,通过注册这两个事件,我们可以对未经处理的全局异常集中执行自定义处理。

  对于在主UI线程上运行的代码未处理的每个异常,Application都将引发一个 DispatcherUnhandledException。当您处理一个来自 DispatcherUnhandledException 的未经处理的异常,并且不希望 WPF 继续处理该异常时,需要将 Handled 属性设置为 true。通俗的讲,如果不希望应用程序崩溃,我们需要将Handled 属性设置为 true。但不是所有的异常都可恢复,如果异常是FileNotFoundException,程序可以在处理异常后继续运行,如果异常是StackOverflowException,则无法再继续运行,即将关闭。

  对于在任何线程中的任何未处理的异常,以及无论什么应用程序域中的异常都将引发UnhandledException。如果UI线程中的异常未处理,也会引发UnhandledException。从.NET Framework 4开始,损坏进程状态异常将不引发该事件,如堆栈溢出,或者是访问冲突。因为默认情况下,公共语言运行时 (CLR) 并不把这些异常输出到托管代码,且不为它们调用 try/catch 块。

  奉上简单代码:

      /// <summary>
/// 应用程序启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Application_Startup(object sender, StartupEventArgs e)
{
Current.DispatcherUnhandledException += App_OnDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
} /// <summary>
/// UI线程抛出全局异常事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
try
{
LogHelper.Instance.Logger.Error(e.Exception, "UI线程全局异常");
e.Handled = true;
}
catch (Exception ex)
{
LogHelper.Instance.Logger.Error(ex, "不可恢复的UI线程全局异常");
MessageBox.Show("应用程序发生不可恢复的异常,将要退出!");
}
} /// <summary>
/// 非UI线程抛出全局异常事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
var exception = e.ExceptionObject as Exception;
if (exception != null)
{
LogHelper.Instance.Logger.Error(exception, "非UI线程全局异常");
}
}
catch (Exception ex)
{
LogHelper.Instance.Logger.Error(ex, "不可恢复的非UI线程全局异常");
MessageBox.Show("应用程序发生不可恢复的异常,将要退出!");
}
}

WPF捕获未处理的异常的更多相关文章

  1. C# WinForm捕获未处理的异常

    using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespa ...

  2. android 捕获未try的异常

    1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...

  3. android 捕获未try的异常、抓取崩溃日志

    1.Thread.UncaughtExceptionHandler java里有很多异常如:空指针异常,越界异常,数值转换异常,除0异常,数据库异常等等.如果自己没有try / catch 那么线程就 ...

  4. C# WinForm捕获全局异常(捕获未处理的异常)

    static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static vo ...

  5. WPF捕获全局未处理异常

    在WPF开发过程中我们一般都用try/catch块来捕获异常,但不是每个异常我们都能捕获,程序总会出现一些意想不到情况,抛出一些未捕获的异常,这时就要用到全局异常捕获,即在程序的最外层加上捕获未处理异 ...

  6. Android程序捕获未处理异常,处理与第三方方法冲突时的异常传递

    自己的android程序对异常进行了处理,用的也是网上比较流行的CrashHandler,代码如下,就是出现了未处理的异常程序退出,并收集收集设备信息和错误信息仪器保存到SD卡,这里没有上传到服务器. ...

  7. Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出

    Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出 package com.test; import org.apach ...

  8. 编写高质量代码改善C#程序的157个建议——建议66:正确捕获多线程中的异常

    建议66:正确捕获多线程中的异常 多线程的异常处理需要采用特殊的方式.一下这种方式会存在问题: try { Thread t = new Thread((ThreadStart)delegate { ...

  9. 如何捕获winform程序全局异常?(续)

    前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...

随机推荐

  1. mysql autocommit=OFF导致wordpress 建立数据库连接时出错

    今天安装wordpress完成后跳转到login页面时,出现建立数据库连接时出错.网上清一色的拷贝http://mt.sohu.com/20160917/n468547634.shtml的答案. 只能 ...

  2. Servlet生命周期及工作原理

    1 Servlet生命周期Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方 ...

  3. Linux 学习手记(6): 磁盘、分区、MBR与GPT

    1. 磁盘在LINUX中的表示 Linux所有设备都被抽象为一个文件,保存在/dev目录下 设备名称一般为hd[a-z]或者sd[a-z]([a-z]为分区号),如:hda.hdb.sda.sdb I ...

  4. Xslider演示8种滚动效果

    Xslider演示8种滚动效果包括: 一.左右切换:每次移动固定距离 二.左右切换:最后一个显示在最右侧 三.自动切换 四.循环切换 五.文本的上下滚动 六.上下切换 七.上下自动循环切换 在线预览 ...

  5. Masonry – 实现 Pinterest 模式的网格砌体布局

    Masonry 是一款 JavaScript 网格布局插件,可以实现类似 Pinterest 模式的砌体布局效果.通过把元素自动填充在垂直的空白区域,就像墙上堆砌的石头一样.这个库还可以作为 jQue ...

  6. jQuery原型属性constructor,selector,length,jquery和原型方法size,get,toArray源码分析

    首先看一下在jQuery1.7.1中定义的原型属性和方法有哪些? init方法作为实际的构造函数已经详细分析过了,需要了解可以参考http://www.cnblogs.com/yy-hh/p/4492 ...

  7. 利用Canvas实现360度浏览

    前言:最近几个月来到新公司,主要从事移动端方面的开发,有时候也挺忙挺累的,于是就好一段时间没写博客了.其实自己在这几个月里,自己对canvas以及createjs和egret都有了一定程度上的认识与掌 ...

  8. Android Studio 小提示,新建Activity

    Android Studio是在google I/O大会上新发布的一个IDE,基于IntelliJ,Android开发除了Eclipse之外又多了一种选择. 在Android Studio中如何在当前 ...

  9. Ubuntu16.04 LTS 下安装 Android Studio 2.2.2 步骤

    下载 Android SDK,官网:www.android.com 我相信很多人跟我一样,进不去.Android Studio 中文官网 www.android-studio.org 进去下载, 在终 ...

  10. 【译】仿Taasky的3D翻转菜单动画实现

    最终效果 最终效果 开始 首先下载并打开一个事先搭好架子的Demo,然后来分析一下.这个Demo包含一个主页和详情页,其中MenuViewController继承自UITableViewControl ...