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 ...
随机推荐
- 如何有规律的备份 WordPress 博客(转)
转自:http://blog.wpjam.com/m/backup-your-blog-regularly/ 我们都知道备份 WordPress 博客应该是规律性的操作,但是事实上往往我们都会因为 ...
- jquery 添加列
{field:'action',title:'操作',width:70,align:'center', formatter:function(value,row,index){ if (row.e ...
- ubuntu14.04 安装mono
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831 ...
- pyDay14
内容来自廖雪峰的官方网站. 1.map的优点:省代码 + 提高可读性. 2.map 运用示例: >>> def f(x): ... return x * x ... >> ...
- 20145221 《Java程序设计》第六周学习总结
20145221 <Java程序设计>第六周学习总结 教材学习内容总结 第十一章部分 - 输入与输出 文件的读写 网络上传数据的基础 同样要先掌握父类中方法,核心类如下: 以上则是老师提出 ...
- 2016湘潭邀请赛—Heartstone
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1246 题意: 有n只怪,每只怪有指定的HP.现在1和2两种攻击方式,前者扣 ...
- __autoload自动加载类
在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利.这也是OO设计的基本思想之一.在PHP5之前,如果需要使用 ...
- Android之提示Toast
步骤: 设置监听事件步骤1.事件源,如按键 btn_simple2.事件 OnClick3.监听器new OnClickListener3.绑定事件源与事件 setOnClickListener(ne ...
- 最近公共祖先问题 LCA
2018-03-10 18:04:55 在图论和计算机科学中,最近公共祖先,LCA(Lowest Common Ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点. 计算 ...
- data模块
这个模块原本应该存放Excel文件,提供utils目录下的config模块调用: 这里公司内部无法使用Excel读取数据,顾使用了ddt,其实里面就是.xslx文件