说说asp.net中的异常处理和日志追踪

关于异常的处理想必大家都了解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();

}

利用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中的异常处理和日志追踪

时间: 2024-10-01 04:55:43

说说asp.net中的异常处理和日志追踪的相关文章

[转]asp.net5中使用NLog进行日志记录

本文转自:http://www.cnblogs.com/sguozeng/articles/4861303.html asp.net5中使用NLog进行日志记录 asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大.asp.net5中也包括NLog的实现,下面把最简单的使用方法写出来,抛砖引玉,让更多对此不熟悉的同学们能借此入门. 1.在project

asp.net5中使用NLog进行日志记录

asp.net5中提供了性能强大的日志框架,本身也提供了几种日志记录方法,比如记录到控制台或者事件中等,但是,对大部分程序员来说,更喜欢使用类似log4net或者Nlog这种日志记录方式,灵活而强大.asp.net5中也包括NLog的实现,下面把最简单的使用方法写出来,抛砖引玉,让更多对此不熟悉的同学们能借此入门. 1.在project.json中添加对Microsoft.Framework.Logging.NLog的引用,目前最新是beta8版本: 2.然后添加NLog.config配置文件到

JAVA中的异常处理及日志(log4j为例)的使用

Java的异常 1.Java中所有异常和错误的基类:Throwable Throwable  error Exception (检查时异常)(运行时异常) RuntimeException2.Java中的异常分为运行时异常和检查时异常 运行时异常是表示RuntimeException以及所有子类,这些异常无需再程序中捕获,大多可以通过代码进行控制避免 检查时异常:除了RuntimeException以及其所有子类之外的所有异常,这些异常必须在程序中进行捕获处理. 异常的第一种处理机制--使用tr

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

原文:Asp.NetCore依赖注入和管道方式的异常处理及日志记录 前言 ????在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog 组件进行记录:同时,还将介绍两种不同的 异常捕获方式:管道捕获/服务过滤:通过本练习,将学习到如何捕获异常.处理异常跳转.记录异常信息. 1. 搭建框架 ????首先,创建一个 WebApi 项目,选择 Asp.Net Core W

【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-delete.html http://www.yuanjiaocheng.net/webapi/Consume-web-api.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-po

asp.net中当服务器出错时显示指定的错误页面

http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常.ASP.NET在异常处理方面比传统的ASP更优越.在ASP.NET中,允许在应用程序的各个层面中处理异常.ASP.NET的新特性ASP.NET为捕获并处理异常提供了更多的便利.在传统的ASP程序中,我们用“On Error Resume Next”(或Jscript的Try-catch)来处理异常.

Asp.Net事务和异常处理:

Asp.Net事务和异常处理:一.什么是事务处理?事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性.如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库中的一部分,如果遇到错误,则不会对数据库进行任何修改.二.事务处理过程.1. 开始一个事务.进入“事务待命”状态.2. 在“事务待命”状态,记录事务中改变的数据库记录.此改变不能直接改变数据库中的值,必须先用一个顺序的“事务日志”记录在一边.同时,对于要改变的原始记录加锁

asp.net core 自定义异常处理中间件

原文:asp.net core 自定义异常处理中间件 asp.net core 自定义异常处理中间件 Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异常,不希望记录错误日志,目前主要是用户请求取消导致的 TaskCanceledException 和 OperationCanceledException 异常.因为我的 ERROR 级别的日志会输出到 Sentry,sentry的异常会自动发邮

项目中java异常处理

一.java异常类介绍. Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类. 有一篇比较好的blog,http://blog.csdn.net/hguisu/article/details/6155636 介绍java异常. 二.异常处理方式. 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常. 三.程序中使用. 2种处理方式 1.throw new 异常  在方法体上写throws