课程名:Windows应用程序开发入门到精通七:优化.NET异常处理
1.多个catch块的情况时会过滤异常,先截获具体的异常,再截获一般的异常,并且这是从编译器的层次就支持的。
2.应该从系统异常(System.ApplicationException)派生自己的具体异常,从而为特定的应用程序提供更好的支持。
3.异常处理技术:1)记录异常:在文件中记录异常;在数据库中记录;在Eventlog中记录。2)发email等信息来通知异常。总之,要以用户友好的方式通知异常的发生。
4.使用Application对象中的ThreadException属性来设置一个delegate来捕获所有未处理的主线程中出现的异常,但并不能处理你自己创建的工作进程中出现的异常。
public static void Main(string[] args)
{
Application.ThreadException += new 
ThreadExceptionEventHandler(
MainUIThreadExceptionHandler);
Demo6();
System.Windows.Forms.Application.Run(
new NorthwindMDIMain());
}
public static void MainUIThreadExceptionHandler(
Exception e)
{
MainUIThreadExceptionHandler(null, new System.Threading.
ThreadExceptionEventArgs(e));
}
public static void MainUIThreadExceptionHandler(object
sender, ThreadExceptionEventArgs t)
{
ExceptionManager.Publish(t.Exception);
//Tell the user a boo-boo occurred
MessageBox.Show(
"Northwind Orders has encountered the following "
+ " problem:" + (char)13
+ (char)13 + t.Exception.Message
+ (char)13 + (char)13 
+ "Please contact your administrator or the "
+ "Northwind Help desk at "
+ (char)13 + (char)13 +"1-855-555-5555."
+ (char)13 + (char)13 
+ "We apologize for the inconvenience."
, "Northwind Orders Encountered a Problem"
, MessageBoxButtons.OK
, MessageBoxIcon.Error
, MessageBoxDefaultButton.Button1 
, MessageBoxOptions.ServiceNotification);        
}
5,必须考虑在工作线程中出现的异常,在线程的入口使用try-catch,并且使用delegate等方式将异常通知给主线程,此外,线程之间要访问对方的界面成员时,应该通过BeginInvoke()方法来进行。
public delegate void DoneDelegate(bool Stopped);
public delegate void
WorkerThreadExceptionHandlerDelegate(Exception e);
void WorkerThreadExceptionHandler(Exception e)
{
UpdateProgress();
SetStatusText("Problem Encountered");
this.Text = "Customers";
btnSave.Text = "Save";
btnClose.Enabled = true;
//Call the global exception handler
MainClass.MainUIThreadExceptionHandler(
this, new System.Threading.
ThreadExceptionEventArgs(e));
}
private void btnSave_Click(object sender, System.EventArgs e)
{
try
{
if(true==btnSave.Enabled)
{
this.Text = "Customers (Saving)";
btnSave.Enabled=false;
btnClose.Enabled=false;
System.Threading.Thread t = 
new System.Threading.Thread( 
new System.Threading.ThreadStart(
SaveCustomer));
t.Start();
}
else
{
isCanceled = true;
btnSave.Enabled = true;
}        
}
catch(NotSupportedException exception)
{
MessageBox.Show("Code not done yet "
+ exception.Message 
);
}
catch(Exception exception)
{
//Tell the user a boo-boo occurred
MainClass.MainUIThreadExceptionHandler(this
,new System.Threading.
ThreadExceptionEventArgs(exception));
MessageBox.Show(
"Northwind Orders has encountered a problem.  "
+ "Please contact your administrator or the "
+ "Northwind Help desk at "
+ (char)13 + (char)13 +"1-855-555-5555."
+ (char)13 + (char)13 
+ "We apologize for the inconvenience."
, "Northwind Orders Encountered a Problem"
, MessageBoxButtons.OK
, MessageBoxIcon.Error);
}
finally
{
this.Cursor=Cursors.Default;
}
}
private void SaveCustomer()
{
try
{
SetStatusText(
"Saving record on a background thread");
//TODO:  Add code to save the customer record
this.BindingContext[dsCustomers,"Customers"].
EndCurrentEdit();
dsCustomers objDataSetChanges = ((dsCustomers)
(dsCustomers.GetChanges()));
if(null!=objDataSetChanges)
new NorthwindDataAccess().UpdateCustomers(
objDataSetChanges);
isCanceled = false;
DoneDelegate delDone = new DoneDelegate(Done);
delDone.BeginInvoke(isCanceled, null, null);
}
catch(Exception e)
{
new WorkerThreadExceptionHandlerDelegate(
WorkerThreadExceptionHandler).BeginInvoke(e
,null
,null);
}
}
private void Done (bool Stopped)
{
UpdateProgress();
this.Text = "Customers";
btnSave.Enabled=true;
btnClose.Enabled=true;
if(Stopped)
{
MessageBox.Show("Save Stopped"
, "Stopped"
, MessageBoxButtons.OK
, MessageBoxIcon.Warning);
SetStatusText("Save Stopped");
}
else
{
MessageBox.Show("Save Done"
, "Done" 
, MessageBoxButtons.OK 
, MessageBoxIcon.Information);
SetStatusText("Save Done");
}
}
6,在构造函数中不要加try-catch,因为这会把异常再抛给外部方法,还不如不处理,直接抛给外部好了。
7,异常处理程序块采用的是publisher/subscriber设计模式,在工程中添加对它的引用,并引入名称空间Microsoft.ApplicationBlocks.ExceptionManagement就可以使用ExceptionManager.Publish()来进行异常的发布。在app.config中可以对异常管理进行启/停,还可以添加自己的异常处理模块。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="exceptionManagement" 
type="Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManagerSectionHandler,Microsoft.ApplicationBlocks.ExceptionManagement" />
</configSections>
<exceptionManagement mode="on">        
<publisher mode="on" assembly="Microsoft.ApplicationBlocks.ExceptionManagement" 
type="Microsoft.ApplicationBlocks.ExceptionManagement.DefaultPublisher" 
logname="Northwind Exceptions Log" 
applicationname="Northwind Traders Orders" />
</exceptionManagement>
</configuration>
public static void MainUIThreadExceptionHandler(object
sender, ThreadExceptionEventArgs t)
{
ExceptionManager.Publish(t.Exception);
//Tell the user a boo-boo occurred
MessageBox.Show(
"Northwind Orders has encountered the following "
+ " problem:" + (char)13
+ (char)13 + t.Exception.Message
+ (char)13 + (char)13 
+ "Please contact your administrator or the "
+ "Northwind Help desk at "
+ (char)13 + (char)13 +"1-855-555-5555."
+ (char)13 + (char)13 
+ "We apologize for the inconvenience."
, "Northwind Orders Encountered a Problem"
, MessageBoxButtons.OK
, MessageBoxIcon.Error
, MessageBoxDefaultButton.Button1 
, MessageBoxOptions.ServiceNotification);        
}
可以在“事件查看器”中看到异常已经发布进来了:
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/10/28/543145.html,如需转载请自行联系原作者

WebCast听课录(10)相关推荐

  1. 设计模式调优-性能设计沉思录(10)

    JAVA调优系列文章 JVM调优全面探讨-性能设计沉思录(1)_luozhonghua2000的博客-CSDN博客 JVM GC回收和内存分配优化-性能设计沉思录(2)_luozhonghua2000 ...

  2. MyBatis研习录(10)——MyBatis多对多查询

    C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...

  3. 听课评课记录计算机应用,教师听课的评语(精选10篇)

    教师听课的评语(精选10篇) 通过引导学生提炼信息提出问题解决问题,使学生再次感受了数学与现实生活的密切联系,经历了运用乘法口诀求商的计算方法的形成过程,培养了学生对知识的迁移能力.下面是小编整理的教 ...

  4. 上海计算机一级优秀率,数据 | 上海初中哪家强?2020四校八大预录数据告诉你!...

    在上海,评价一所学校,有这么一句话:初中看预录,高中看综评.说到预录,首先想到的就是上海最有名的四校八大,各初中每年的四校八大预录人数一直是家长们的重要参考指标! 根据2020年各校的预录数据,我们整 ...

  5. JAVA编程调优全集-性能设计沉思录(12)

    各文章各专题涉及到还原实践中的场景,原理,方法,模型,代码,原则,设计等:精心打造系列分享,阅读者仔细了解,必定有所收获,也可以收藏,日后工作中参考. 线程与JVM调优专题:设计模式调优-性能设计沉思 ...

  6. 中学计算机课使用登记册,中学信息技术听课记录.doc

    文档介绍: 中学信息技术听课记录,初二信息技术听课记录,信息技术听课记录,初中信息技术听课笔记,高中语文听课记录20篇,信息技术flash听课记录,七年级信息技术听课,听课记录信息技术表格,初二信息听 ...

  7. python外包_python怎么找外包

    很多程序员兄弟们工资不高,但时间还是比较充足的,剩下的时间想多搞点外快,毕竟要养家糊口.我来讲讲怎么做可以一个月轻松多赚1万多元的外快. 一.接项目 是程序员都想过接私活,但真正去做了的寥寥无几.可能 ...

  8. 本周学习进度表及时间安排(2018-1-7~2018-1-13)

    本周学习进度表: 时间 2018/1/7~2018/1/13 代码量(行) 100 博客篇数 4 学习到的新知识 软件发布管理与项目总结 本周时间安排: 日期 开始时间 结束时间 净时间 活动 201 ...

  9. day04--课后练习

    !/usr/bin/env python_*_coding:utf-8_*_@Author : Wenjie 1,写代码,有如下列表,按照要求实现每⼀个功能li = ["alex" ...

最新文章

  1. 智慧城市监控照明物联网管理系统应用分析
  2. nethogs 查看 Linux 进程的网络使用
  3. 深度学习数学基础(三): 激活函数、正则化函数、损失函数、评价指标
  4. Jmeter之逻辑控制器操作
  5. stringwriter_Java StringWriter toString()方法与示例
  6. 我参与的一个项目的继续总结:牢骚篇
  7. ubuntu scrt
  8. 最好用的Redis客户端
  9. 【报告分享】2021年自驾游数据报告-马蜂窝旅游(附下载)
  10. 苹果执行请求时出错_错误报告 - Apple Developer
  11. rc列联表_推荐一款轻便的RC列联表卡方统计
  12. html漂浮图片代码关闭,带关闭功能的漂浮图片代码
  13. 一文搞定细菌基因组De Novo测序分析
  14. 亮度键消失、亮度键失灵且电脑亮度为最大 | 小米 | win11 | 解决办法最最最全合集
  15. 参加计算机比赛英语,高中英语作文关于电脑比赛的
  16. Mac电脑-mysql密码忘了怎么处理
  17. 005-汇编加法指令ADD
  18. JVM知识梳理(二)之垃圾收集器与内存分配策略
  19. Python-python程序打包为独立的EXE文件,并配上自定义的图标
  20. Android-Super分区

热门文章

  1. oracle 11g 的em启动不了
  2. jmx使用应该注意的基本规范
  3. 开放API接口 笑话、天气、新闻
  4. 实例详解 DB2 排序监控和调优
  5. MySQL 千万级数据表 partition 实战应用
  6. hadoop + spark+ hive 集群搭建(apache版本)
  7. CentOS安装jdk的三种方法
  8. NOI 2013 矩阵游戏
  9. java list三种遍历方法性能比較
  10. SCCM 2007系列7 补丁分发上