http://www.cnblogs.com/liuyueyu/p/4476151.html

百密一疏的Bug很难避免,没有谁能保证,我的程序永远 0 BUG;

突然接手一个很庞大的项目,在项目运行期间会莫名异常结束,异常极难重现,还找不出BUG代码,代码太多了。

这个时候就需要把程序中发生的BUG记录下来,知道哪里BUG了,才好下次更新解决。

把所有代码全部加 try catch ?  那就怀孕了,真的搞大了。

未捕获的异常处理:

一:C# 在 Application 类中提供了 DispatcherUnhandledException 事件,用于处理UI线程上未捕获的异常

public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
DispatcherUnhandledException += App_DispatcherUnhandledException;
base.OnStartup(e);
} void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//e.Exception 发生的异常
//e.Handled 是否已处理异常事件
}
}

但是 DispatcherUnhandledException 捕获不了 非UI线程上发生的异常

二:C# 在 AppDomain 类中提供了 UnhandledException 事件,用于捕获应用程序域中发生的异常

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show("Unhandle");
//MessageBox.Show((e.ExceptionObject == null ? "Null" : e.ExceptionObject.GetType().Name),
// "CurrentDomain_UnhandledException:");
}

这样就能捕获应用程序域中发生的异常,当然,包括UI线程和非UI线程异常,如果你有创建应用程序域的需求,创建完成,再绑定下事件即可。

但是AppDomain.UnhandledException 事件没有提供 终止异常,也就是说,异常发生了,你没捕获,这里通知一下,但是该程序结束还得结束。

在这里要特别提到官方封装的 Delegate.BeginInvoke();

"已知:"在异步函数中发生了异常并且没处理:

"求解:"

1.没调用 Delegate.EndInvoke() 函数:

终止执行。 程序不会挂掉,异常丢弃。这是种很隐蔽的BUG,很难发现。

AppDomain.UnhandledException 事件不会通知发生了异常,这里要特别注意。

public void Hello()
{
World();
Load();
} public void World()
{
throw new Exception();
} public void Load()
{
MessageBox.Show("Suc");
} var action = new Action(Hello);
action.BeginInvoke(null, null);

像这种示例,如果在World() 方法中发生了异常,线程会立即终止,Load() 函数就不会执行,程序也不会终止。

一个函数没有执行,也许就会导致很严重的异常,还很难发现。

2.调用了 Delegate.EndInvoke() 函数:

异常抛出, 程序挂掉。

AppDomain.UnhandledException 事件会通知发生了异常

这里也许会有个需求,如果我想处理 AppDomain.UnhandledException 事件中的异常怎么办?程序挂了太恶心了。

我们来继续扩展这个框架

解决在非UI线程中访问UI 异常的小方法

/// <summary>
/// 委托 扩展类
/// </summary>
public static class DelegateExtension
{
/// <summary>
/// 可以被捕获异常的异步调用
/// </summary>
/// <param name="dele"></param>
public static void UnsafeBeginInvoke(this Delegate dele)
{
var action = new Action(() =>
{
dele.DynamicInvoke();
});
action.BeginInvoke(new AsyncCallback((ar) =>
{
try
{
action.EndInvoke(ar);
}
catch (Exception ex)
{
App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
throw ex;
}));
}
}), null);
}
}

有点不伦不类哈,厄。把异常推送到UI线程上抛出,让Application.DispatcherUnhandledException 事件处理

其它:C# 在 TaskScheduler 类中提供了 UnobservedTaskException 事件,用于捕获 Task 异步异常

求评论,求吐槽,求求你^v^

WPF 程序 处理未捕获异常,和程序莫名终止说拜拜的更多相关文章

  1. Android-小小设置永久解决程序因为未捕获异常而异常终止的问题

    (一) 前言各位亲爱的午饭童鞋,是不是经常因为自己的程序中出现未层捕获的异常导致程序异常终止而痛苦不已?嗯,是的.. 但是,大家不要怕,今天给大家分享一个东东可以解决大家这种困扰,吼吼! (二) Un ...

  2. WPF中Dispatcher未捕获异常之处理

    在UI线程中 在APP.XAML中定义 DispatcherUnhandledException事件 在工作线程中 PageMain.GetInstance().Dispatcher.Invoke(( ...

  3. APP级别处理未捕获异常

    前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP. 有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示"程序出现异常,3秒后将 ...

  4. .Net 下未捕获异常的处理

    原地址:http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html .Net 下未捕获异常的处理 作者:Eaglet 随着.Net技术的 ...

  5. WPF发布程序后未授予信任的解决办法

    WPF发布程序后未授予信任的解决办法 基于浏览器的WPF应用程序由于需要比较高的操作权限,所以在项目的安全性属性中选择了“这是完全可信的应用程序”选项.可是,在发布部署后,在其他电脑上打开xbap文件 ...

  6. 【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1

    from:http://blog.csdn.net/chichaodechao/article/details/8294922 在开发winform程序时,用到多线程,在服务器部署后运行,老是自动关才 ...

  7. 关于未捕获异常的处理(WPF)

    这一篇文章来谈谈对于WPF应用程序开发中的未捕获异常的处理. 首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try-catch的方式.但是总是有一些意外的情况 ...

  8. WPF 之 未捕获异常的处理

    首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try…catch的方式.但是总是有一些意外的情况可能会发生,这就导致会出现所谓的“未捕获异常(Unhandle ...

  9. 史上最坑的证书报错解决方法:Code=3000 "未找到应用程序的“aps-environment”的权利字符串"

    在ios注册远程通知获取设备令牌token的时候 // 注册远程通知获取设备令牌 toKen [[ UIApplication sharedApplication ] registerForRemot ...

随机推荐

  1. FCKeditor配置与使用

    fckeditor - (1)资料介绍与安装 fckeditor介绍  FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.  1.fckeditor官网:http://ww ...

  2. JQuery Ajax jsonp

    JQuery ajax jsonp $.ajax({ method:"POST", url:"http://localhost:8081/ChenLei/PeopleSe ...

  3. jQuery实现鼠标点击Div区域外隐藏Div

    冒泡定义:当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡:这个事件从原始元素开始一直冒泡到DOM树的最上层.(摘自网络 ...

  4. .Net t图片生成水印

    借鉴于博客园园友的方法,大神神风(https://www.cnblogs.com/tandyshen/archive/2012/04/14/picwater.html) ,很实用的一种 自定义水印方法 ...

  5. HDU 4616 Game(经典树形dp+最大权值和链)

    http://acm.hdu.edu.cn/showproblem.php?pid=4616 题意:给出一棵树,每个顶点有权值,还有存在陷阱,现在从任意一个顶点出发,并且每个顶点只能经过一次,如果经过 ...

  6. UVa 12549 机器人警卫(最小点覆盖)

    https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...

  7. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp

    D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...

  8. install ros-indigo-pcl-conversions

    CMake Warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake: (find_package): Could not fi ...

  9. ultraedit开发使用技巧

    抛开Mybatis和Hibernate这些dao框架,如果维护老项目时或者不得不用sql拼接时,一个几百行的sql光是去掉navicat中查询的注释或者在sql前后加上双引号就已经很费劲,影响开发效率 ...

  10. IP地址分配机构

    IP地址分配机构 全球ip地址分配机构 互联网编号分配机构(IANA,Internet Assigned Numbers Authority)负责分配和规划IP地址,以及对TCP/UDP公共服务的端口 ...