WPF 程序 处理未捕获异常,和程序莫名终止说拜拜
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 事件中的异常怎么办?程序挂了太恶心了。
我们来继续扩展这个框架

/// <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 程序 处理未捕获异常,和程序莫名终止说拜拜的更多相关文章
- Android-小小设置永久解决程序因为未捕获异常而异常终止的问题
		(一) 前言各位亲爱的午饭童鞋,是不是经常因为自己的程序中出现未层捕获的异常导致程序异常终止而痛苦不已?嗯,是的.. 但是,大家不要怕,今天给大家分享一个东东可以解决大家这种困扰,吼吼! (二) Un ... 
- WPF中Dispatcher未捕获异常之处理
		在UI线程中 在APP.XAML中定义 DispatcherUnhandledException事件 在工作线程中 PageMain.GetInstance().Dispatcher.Invoke(( ... 
- APP级别处理未捕获异常
		前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP. 有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示"程序出现异常,3秒后将 ... 
- .Net 下未捕获异常的处理
		原地址:http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html .Net 下未捕获异常的处理 作者:Eaglet 随着.Net技术的 ... 
- WPF发布程序后未授予信任的解决办法
		WPF发布程序后未授予信任的解决办法 基于浏览器的WPF应用程序由于需要比较高的操作权限,所以在项目的安全性属性中选择了“这是完全可信的应用程序”选项.可是,在发布部署后,在其他电脑上打开xbap文件 ... 
- 【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1
		from:http://blog.csdn.net/chichaodechao/article/details/8294922 在开发winform程序时,用到多线程,在服务器部署后运行,老是自动关才 ... 
- 关于未捕获异常的处理(WPF)
		这一篇文章来谈谈对于WPF应用程序开发中的未捕获异常的处理. 首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try-catch的方式.但是总是有一些意外的情况 ... 
- WPF 之 未捕获异常的处理
		首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try…catch的方式.但是总是有一些意外的情况可能会发生,这就导致会出现所谓的“未捕获异常(Unhandle ... 
- 史上最坑的证书报错解决方法:Code=3000 "未找到应用程序的“aps-environment”的权利字符串"
		在ios注册远程通知获取设备令牌token的时候 // 注册远程通知获取设备令牌 toKen [[ UIApplication sharedApplication ] registerForRemot ... 
随机推荐
- 20172305 2018-2019-1 《Java软件结构与数据结构》第三周学习总结
			20172305 2018-2019-1 <Java软件结构与数据结构>第三周学习总结 教材学习内容总结 本周内容主要为书第五章内容: 队列 线性集合(元素从一端加入,另一端删除) 先进先 ... 
- UVA 11019 Matrix Matcher(二维hash + 尺取)题解
			题意:在n*m方格中找有几个x*y矩阵. 思路:二维hash,总体思路和一维差不太多,先把每行hash,变成一维的数组,再对这个一维数组hash变成二维hash.之前还在想怎么快速把一个矩阵的hash ... 
- hdu_2048 错排问题
			错排问题本质上就是一个动态规划问题,其状态转移方程为: 记d[n]为n个人错排情况的总数. 那么策略可以描述为:分析第n个人错排的可能情况: 1)前n-1个人满足错排的情况,那么第n个人加入后还要错排 ... 
- 记录web api的request以及response(即写log)
			https://www.cnblogs.com/felixnet/p/5689501.html https://blog.csdn.net/Vblegend_2013/article/details/ ... 
- asp.net自定义控件之加载层
			知识点:JQuery.Ajax.自定义控件 该文旨在给大家开发自定义控件(结合js)一个思路,一个简单的示例,可能在实际项目中并不会这样做. 先来看看效果: 1.在静态页面里开发好想要的效果 jQue ... 
- POJ 2528 Mayor's posters(线段树染色问题+离散化)
			http://poj.org/problem?id=2528 题意: 给出一面无限长的墙,现在往墙上依次贴海报,问最后还能看见多少张海报. 题意:这道题目就相当于对x轴染色,然后计算出最后还能看见多少 ... 
- lapply
			正如前面展示的,lapply( )函数接收一个向量和一个函数作为输入参数.它将这个函数应用到向量中的每个元素,再将结果以列表的形式返回.当每次迭代都是相互独立时,这个函数就非常好用.因为在这种情况下, ... 
- [转]Linux下彻底卸载mysql详解
			http://www.jb51.net/article/97516.htm 一.使用以下命令查看当前安装mysql情况,查找以前是否装有mysql 1 rpm -qa|grep -i mysql 可以 ... 
- TryUpdateModel方法 模型绑定
			文档资料:https://msdn.microsoft.com/zh-cn/library/ee728634.aspx 有很多重载其中 Controller.TryUpdateModel<TMo ... 
- MyBatise代码自动生成时候Oralce的number类型BigDecimal问题
			使用MyBatise的代码自动生成工具时候,即便在配置文件中定义了 <javaTypeResolver> <property name="forceBigDecimals& ... 
