说说asp.net中的异常处理和日志追踪
关于异常的处理想必大家都了解try{}catch(){}finally{},这里就不再讲了。通过在VS里的"调试"-"异常",在弹出的异常对话框里的Common Language Runtime Exceptions栏里是.NET中的异常层次结构。
自定义异常:
如果系统提供的异常类已经不能够满足应用系统开发的需要,或者开发团队需要一套自定义异常处理机制,可以创建自定义的异常类。自定义异常类应该直接过间接地继承自ApplicationException类,并且其最好有良好的命名:错误的描述性名称+Exception,应该定义3个构造函数:默认构造函数,接受错误消息的构造函数,接受错误消息和内部异常对象的构造函数。CLR抛出的异常都继承自SystemException,应用程序抛出的异常应当继承自ApplicationException。这样一来,开发人员就能够编写catch块来捕获所有CLR抛出的异常或所有应用程序抛出的异常。
记录异常:
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();
}
利用log4net来记录日志
http://blog.csdn.net/zhoufoxcn/archive/2010/11/23/6029021.aspx|推荐
http://www.cnblogs.com/dragon/archive/2005/03/24/124254.aspx|推荐
http://www.cnblogs.com/xugang/archive/2008/04/09/1145384.html
http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx
http://blog.csdn.net/antyi/archive/2007/04/30/1592812.aspx
下面配置的是每天都产生一个txt日志文件的方式,其他方式在第一个链接里都有描述,第二个链接理论讲的很好
<log4net>
<root>
<appender-ref ref="RollingLogFileAppender_DateFormat" />
</root>
<appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
<file value="Log/Dailylog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="日期[%date]线程ID[%thread]文件名[%file]行号[%line]%-5当前优先级别[%level]错误描述[%message]" />
</layout>
</appender>
</log4net>
页面追踪
尽管ASP.NET的错误页面提供了非常有用的信息,但是有时候开发人员需要更详细的信息来修正应用程序中的错误。比如应用程序执行一个属性或者是追踪应用程序中的逻辑错误。有时候应用程序可能产生了一些无效的数据,但是并没有明显的异常触发。ASP.NET提供了追踪功能,让开发人员使用一种更方便和有弹性的方式来报告诊断信息。
在页面级别启用除了可以在<%@ Page Trace="true"%>设置外,还可以在代码中设置,如:
protected void Page_Load(object sender,EventArgs e)
{Page.Trace.IsEnabled=true;}
Page对象的Trace属性是System.Web.TraceContext类的实例。使用代码的好处在于可以根据特定的环境来启用和禁止页面追踪功能。
这样运行后ASP.NET追踪提供了大量的诊断信息:
1.请求详细信息(SessionID,请求类型,请求时间,请求的状态码,请求编码,响应编码)
2.跟踪信息(追踪信息显示页面被发送到客户端之前页面的处理流程,并提供了页面执行的详细执行时长)
3.控件树(显示页面上所有runat=server的控件)
4.会话状态和应用程序状态(显示当前应用程序中所有会话状态Session的键,值,类型和所有应用程序状态Application的键,值,类型)
5.请求Cookie集合(web浏览器请求的Cookies的名,值,大小) 响应Cookie集合(web服务器发送的Cookies的名,值,大小)
6.标头集合(列出了所有HTTP头信息(是作为请求的一部分发送到web服务器的一小块信息,包括请求信息,支持的内容类型,使用的语言等))
7.响应标头集合(列出了作为响应发送到客户端的一部分信息)
8.窗体集合(post方式提交的表单信息) 但貌似8,9只是表单中服务器控件的值(ASP.NET页面追踪只追踪服务器控件?)
9.Querystring集合(get方式提交的表单信息/查询字符串中的名称和值)
10.服务器变量(通常不必看)
以上只是针对一个页面使用追踪,可以在根web.config中设置,对整个应用程序启动追踪,在<system.web>下配置:
<system.web>
<trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
</system.web>
requestLimit(最大数量的HTTP请求的追踪信息) traceMode(按什么方式排序) localOnly(追踪信息只显示在本地)
访问这些请求信息时只需访问根目录下的trace.axd(实际不存在)就可以了。
对了,大家都在说程序人生的网站,我也推荐一下吧。
说说asp.net中的异常处理和日志追踪的更多相关文章
- [转]asp.net5中使用NLog进行日志记录
本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志 ...
- asp.net5中使用NLog进行日志记录
asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大. ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
- Asp.NetCore依赖注入和管道方式的异常处理及日志记录
前言 在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...
- ASP.NET Web API 中的异常处理(转载)
转载地址:ASP.NET Web API 中的异常处理
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
- [整理]ASP.NET 中异常处理
[整理]ASP.NET 中异常处理 1.直接通过重写Controller的OnException来处理异常 public class HomeController : Controller { pub ...
- ASP.NET中异常处理的注意事项
一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...
- 在 ASP.NET Core 中使用 Serilog 进行日志记录
目录 从 NuGet 安装 Serilog 在 Main函数 中配置 Serilog 在项目中使用 Serilog 进行日志输出 从 NuGet 安装 Serilog 核心的包是 Serilog 和 ...
随机推荐
- HDU 5642 King's Order dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5642 King's Order Accepts: 381 Submissions: 1361 ...
- myeclipse和ecplise中安装git插件的问题
我的myeclipse10.7和ecplise helis一直安装不了git插件,myeclipse中details说我的myeclipse少了team_features等之类文件,helis的情况大 ...
- 按照事务类型分析 DB2 事物的性能
概述 事务是数据库系统中的核心概念之一.作为数据库系统的逻辑工作单元(Unit of Work),事务必须具有四个属性,即原子性.一致性.隔离性和持久性(ACID).数据库系统往往通过锁机制保证事务的 ...
- IT行业大学生就业分析报告感想
现如今的高校毕业生每年都在增长,就业压力只增不减,人才市场挤满了人 学生们普遍的表现出就业难的情况,并且适合自己的工作也难找 从报告中也容易看出IT行业很吸引人,也是人数最多的,因此机会也就变少了 在 ...
- Splash广告界面
在软件开始启动时都是会使用一个splashActivity实现联网判断和相关资源的加载,在一款网络软件上开始时的缓存加载和网络判断可以为用户节省不必要的流量开销. 使用handler延时启动下一个ac ...
- 树莓派无显示器、无网线,优盘(U盘)启动,远程桌面
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:树莓派无显示器.无网线,优盘(U盘)启动,远程桌面 本文地址:http://techi ...
- PAT 甲级 1054 The Dominant Color
https://pintia.cn/problem-sets/994805342720868352/problems/994805422639136768 Behind the scenes in t ...
- laravel连接多个不同数据库的单例类
在連接多個不同數據庫時,需要寫多個連接,爲了簡化該操作,可以使用該基類,不同的數據庫只要建立好相對應的類繼承該類,就可以使用ORM模型進行操作了. class singletonInstance { ...
- 如何在windows下Apache环境开启htaccess伪静态功能
以下文章来自于网络,只做学习用 很多国人习惯用windows服务器或者在windows系统下调试PHP程序,在调试货使用的时候就遇到开启伪静态的各种问题,今天在网络上搜集了一些开启伪静态需要注意 ...
- layabox 3d 入手
最近受到打击了,3d效果远比2d效果好. 问题 laya3d 有正交相机没有? Laya.Sprite3D.load(XX.lh); 克隆Laya.Sprite3D.instantiate Lay ...