C#的异常处理心得

 

C#的异常处理功能很强大,利用异常处理,我们可以将资源清理代码放在一个固定的位置,并且确保它们得以执行;利用异常处理,我们可以将处理异常的代码防灾一个集中的位置;利用异常处理,我们很容易定位和修复代码中的bug。这方面的资料在网上可以找到一大堆,这里讨论的是异常处理的小技巧,以方便我们找到bug所在。

一:记录未捕获的异常。在代码中我们并不是每一个地方都有try{}catch{},可能会出现未捕获的异常。我们需要将这些异常的详细信息记录下来,方便以后查找。实现思路是:Windows Form程序,你需要在Main函数中添加对未处理异常的处理事件AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

CurrentDomain_UnhandledException中,你可以将异常的详细信息写入到日志文件中; 而对于web 程序呢,你需要在Initialize方法中添加事件this.Error +=new EventHandler(WebForm1_Error); WebForm1_Error中同样你可以写日志,而让所有错误转到一个固定的,友好的出错页。

    二:记录已捕获的异常,针对Windows Form 程序。通常程序有异常出现,呈现给用户的提示信息是要友好的,并不能出现一堆的代码。但是怎样又能让自己知道呢?(当然不是调试时,指的是已经到了提交测试阶段),我们可以在MessageBox.Show()给用户看之前,先将提示信息和异常详细信息同时写入到日志,这样,当有提示信息出现时,你就可以通过查找日志定位到程序的bug出现地方了。

    这都是开发过程中的积累,只能算是一点小心得吧。可能也不是很完善,还请大家提出意见~~

posted on 2005-10-14 16:31 晓攀 阅读(2555) 评论(12) 编辑 收藏

评论

#1楼  回复 引用   

不错!呵呵
2005-10-14 17:08 | simida[未注册用户]

#2楼  回复 引用   

asp.net里好象不行啊
2005-10-14 17:28 | lovebanyi[未注册用户]

#3楼  回复 引用   

asp.net全局的行不行
2005-10-14 17:29 | lovebanyi[未注册用户]

#4楼  回复 引用   

asp.net里面的堆栈跟踪: 和源错误这这两个错误要什么记录起来
2005-10-14 17:34 | lovebanyi[未注册用户]

#5楼  回复 引用 查看   

asp.net的在httpmodule里也可以的.

详细可以参看cs(communityserver.org)论坛的源代码.
2005-10-14 19:15 | XiaoHui      

#6楼  回复 引用   

我在winForm 里做了如下实验
static void Main()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new Form1());

}

public static void CurrentDomain_UnhandledException(object sender,UnhandledExceptionEventArgs e)
{
System.IO.FileStream a = new System.IO.FileStream("c:\\test1.txt", FileMode.CreateNew);
a.Close();
}
在Form里面添加个Button
private void button1_Click(object sender, EventArgs e)
{
DateTime a = Convert.ToDateTime("asdfsad");//出现未捕捉的异常
}

步骤1:调试,出现异常-中断-继续 跳到异常处理CurrentDomain_UnhandledException
写文件成功
步骤2:运行bin下的exe文件,点击button 出现异常提示,点继续,查看未写日志

请问为何调试时可以执行捕捉为处理异常,但直接运行exe文件却无法捕捉

如果是这样,这种方式不是没有什么意义?
2005-10-14 23:53 | as[未注册用户]

#7楼  回复 引用 查看   

谢谢分享!
2005-10-15 10:34 | 秋日私语      

#8楼  回复 引用 查看   

有收获,谢谢!

#9楼  回复 引用   

这是吴延安在MSDN Webcast《企业库系列讲座》中的BookingApp示例中对异常处理的方法。

EntryPoint.cs

using System;
using System.Threading;
using System.Windows.Forms;

namespace BookingApp
{
public class EntryPoint
{
private EntryPoint()
{
}

static void Main()
{
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException +=
new System.UnhandledExceptionEventHandler(AppDomain_UnHandledException);

Application.EnableVisualStyles();
Application.Run(new MainForm());
}

public static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleException(e.Exception, ExPolicy.General);
}

public static void AppDomain_UnHandledException(object sender, System.UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is System.Exception)
{
HandleException((System.Exception)e.ExceptionObject, ExPolicy.Unhandled);
}
}

public static void HandleException(Exception ex, string policy)
{
Boolean rethrow = false;
try
{
rethrow = Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex, policy);
}
catch (Exception innerEx)
{
string errorMsg = "An unexpected exception occured while calling HandleException with policy '" + policy + "'. ";
errorMsg += Environment.NewLine + innerEx.ToString();
MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
throw ex;
}
if (rethrow)
{
throw ex; // WARNING: This will truncate the stack of the exception
}
else
{
MessageBox.Show("An unhandled exception occurred and has been logged. Please contact support.");
Application.Exit();
}
}
}
}

#10楼  回复 引用 查看   

嗯,心得不错,后面的代码也很好。感谢。收藏先。
2005-10-22 13:54 | Cdo      

#11楼  回复 引用   

谢谢 xiaochengyong_
2005-10-24 12:21 | xhp5678

#12楼  回复 引用   

Asp.Net可以在Global.asax里面写
2007-05-25 10:02 | yesun[未注册用户]

导航

<2005年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

公告

昵称:晓攀
园龄:7年8个月
粉丝:2
关注:0

搜索

 
 

常用链接

随笔分类

随笔档案

相册

开源网址

我关注的博客

积分与排名

  • 积分 - 34835
  • 排名 - 3082

最新评论

阅读排行榜

评论排行榜

推荐排行榜