异常处理和日志追踪_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 异常处理和日志追踪

异常处理和日志追踪

 2010/12/28 8:16:10  kendezhu  http://kendezhu.javaeye.com  我要评论(0)
  • 摘要:关于异常的处理想必大家都了解try{}catch(){}finally{},这里就不再讲了。通过在VS里的"调试"-"异常",在弹出的异常对话框里的CommonLanguageRuntimeExceptions栏里是.NET中的异常层次结构。自定义异常:如果系统提供的异常类已经不能够满足应用系统开发的需要,或者开发团队需要一套自定义异常处理机制,可以创建自定义的异常类。自定义异常类应该直接过间接地继承自ApplicationException类,并且其最好有良好的命名
  • 标签:异常处理

关于异常的处理想必大家都了解try{}catch(){}finally{},这里就不再讲了。通过在VS里的"调试"-"异常",在弹出的异常对话框里的Common Language Runtime Exceptions栏里是.NET中的异常层次结构。

自定义异常:

如果系统提供的异常类已经不能够满足应用系统开发的需要,或者开发团队需要一套自定义异常处理机制,可以创建自定义的异常类。自定义异常类应该直接过间接地继承自ApplicationException类,并且其最好有良好的命名:错误的描述性名称+Exception,应该定义3个构造函数:默认构造函数,接受错误消息的构造函数,接受错误消息和内部异常对象的构造函数。CLR抛出的异常都继承自SystemException,应用程序抛出的异常应当继承自ApplicationException。这样一来,开发人员就能够编写catch块来捕获所有CLR抛出的异常或所有应用程序抛出的异常。

anderslly推荐 ?shineqiujuan

记录异常:

Web应用程序的用户可能成千上万,有时除了向用户显示错误信息外可能还需要将异常记录下来,比如web服务器负载过重,一些问题间歇性地多次出现等。.NET框架提供了多种记日志工具,比如可以在错误产生时发送E-mail,添加到数据库记录或读写文件中。一个较好的处理方式是使用windows事件,windows事件程序是windows系统内置的用于记录系统或应用程序日志的一个工具,可以被任何应用程序使用。

控制面板里的管理工具里打开事件查看器来查看windows事件日志。一般事件分类有应用程序(用于记录任何应用程序的错误或通知,通常可以在这里记录ASP.NET应用程序异常)系统(用于记录跟操作系统相关的事件)安全(用于记录安全相关的问题,仅由操作系统使用)。在这些事件分类里单击某个事件将弹出该事件的详细信息窗口。右击这些事件分类后可以清除日志,另存日志,新建日志查看,从文件打开,通过属性可以设置日志文件的大小上限等。如果日志大小超过指定上限,则自动清除过期的事件日志。

将异常写入windows事件日志

System.Diagnostics命名空间下的EventLog类可以读写事件日志

??protected void Button1_Click(object sender, EventArgs e)

?? ? ? ?{

?? ? ? ? ? ?try

?? ? ? ? ? ?{

?? ? ? ? ? ? ? ?int a = 1; int b = 0;

?? ? ? ? ? ? ? ?int c = a / b;

?? ? ? ? ? ?}

?? ? ? ? ? ?catch (Exception ex)

?? ? ? ? ? ?{

?? ? ? ? ? ? ? ?Label1.Text = "<b>错误消息:</b>"+ ex.Message + "<br/>"; ?错误的描述信息

?? ? ? ? ? ? ? ?Label1.Text += "<b>错误源:</b>" + ex.Source + "<br/>"; ? ? 返回哪个程序集出错了

?? ? ? ? ? ? ? ?Label1.Text += "<b>堆栈追踪:</b>" + ex.StackTrace; ? ? ? ? ?

?? ? ? ? ? ? ? ?Label1.ForeColor = System.Drawing.Color.Red;

?? ? 判断windows事件日志里有没有该类事件,我们可以在事件日志看到每个事件都有一个事件ID,事件ID相同的事件就属于同一类事件

?? ? ? ? ? ? ? ?if (!EventLog.SourceExists("除法运算错误"))

?? ? ? ? ? ? ? ?{

?? ? 如果不存在该类事件就注册该类事件,并且将该类事件注册在我们自定义的事件分类里,第二个参数默认为应用程序

?? ? ? ? ? ? ? ? ? ?EventLog.CreateEventSource("除法运算错误", "ASPNET事件日志");

?? ? ? ? ? ? ? ?}

?? ? EventLog类的构造函数可以打开指定的事件分类(相当于某个表)

?? ? ? ? ? ? ? ?EventLog elog = new EventLog("ASPNET事件日志");

?? ? 指定事件来源字符串,该字符串将出现在事件分类的来源栏(相当于来源字段)里

?? ? ? ? ? ? ? ?elog.Source = "来自web服务器";

?? ? 将一个事件项写入指定事件分类里,这里指定了事件描述,事件类型,还可以指定事件ID等(相当于一条记录)

?? ? ? ? ? ? ? ?elog.WriteEntry(ex.Message, EventLogEntryType.Error);

?? ? ? ? ? ?}

?? ? ? ?}

可以看出windows事件日志就像一个数据库,事件分类就是不同的表,里面的事件项就是记录

?

编程查看事件日志(相当于查看数据库中某个表的所有记录)

复杂的,指定了显示的字段

首先创建一个事件项实体类

?? public class EventItem

?? ? ? ?{

?? ? ? ? ? ?public string EventType{get;set;} ? ? ? ? ? 事件类型

?? ? ? ? ? ?public string EventMessage{get;set;} ? ?事件描述

?? ? ? ? ? ?public DateTime EventTime{get;set;} ? ? 事件发生时间

?? ? ? ? ? ?public string EventSource{get;set;} ? ? ? 事件来源

?? ? ? ? ? ?public EventItem(string eventtype,string eventmessage,DateTime eventtime,string eventsource)

?? ? ? ? ? ?{

?? ? ? ? ? ? ? ?EventType = eventtype;

?? ? ? ? ? ? ? ?EventMessage = eventmessage;

?? ? ? ? ? ? ? ?EventTime = eventtime;

?? ? ? ? ? ? ? ?EventSource = eventsource;

?? ? ? ? ? ?}

?? ? ? ?}

然后创建一个列表类用于保存某个事件分类里的所有事件项

??public class EventList : List<EventItem>

?? ? ? ?{

?? ? ? ? ? ?public EventList(string logname)

?? ? ? ? ? ?{

?? ? ? ? ? ? ? ?if (!EventLog.Exists(logname)) 判断是否有该事件分类(是否有该表)

?? ? ? ? ? ? ? ?{

?? ? ? ? ? ? ? ? ? ?return;

?? ? ? ? ? ? ? ?}

?? ? ? ? ? ? ? ?else

?? ? ? ? ? ? ? ?{

?? ? ? ? ? ? ? ? ? ?EventLog elog = new EventLog(logname); ?打开某事件分类

??foreach (EventLogEntry item in elog.Entries) ?事件项是EventLogEntry类型,Entries属性可获取该事件分类里的所有事件项

?? ? ? ? ? ? ? ? ? ?{

?? EventItem eventitem = new EventItem(item.EntryType.ToString(), item.Message, item.TimeGenerated, item.Source);

?? ? ? ? ? ? ? ? ? ? ? ?this.Add(eventitem);

?? ? ? ? ? ? ? ? ? ?}

?? ? ? ? ? ? ? ?}

?? ? ? ? ? ?}

?? ? ? ?}

??protected void Button1_Click(object sender, EventArgs e)

?? ? ? ?{

?? ? ? ? ? ?string logname = TextBox1.Text;

?? ? ? ? ? ?EventList eventlist = new EventList(logname);

?? ? ? ? ? ?GridView1.DataSource = eventlist;

?? ? ? ?}

简单的,获取的事件项包含默认字段

?protected void Button1_Click(object sender, EventArgs e)

?? ? ? ?{

?? ? ? ? ? ?string logname = TextBox1.Text;

?? ? ? ? ? ?EventLog elog = new EventLog(logname);

?? ? ? ? ? ?GridView1.DataSource = elog.Entries; ?Entries属性返回集合类型是EntryCollection,其继承了IEnumerable,可以绑定

?? ? ? ? ? ?GridView1.DataBind();

?? ? ? ?}

发表评论
用户名: 匿名