转载至: http://www.cnblogs.com/chinhr/archive/2007/06/26/795947.html

ASP.NET错误处理的方式(整理&总结)
英文文章研究:http://wrfwjn.blog.hexun.com/4172839_d.html
总述:

创建页中的全局处理程序,请创建 Page_Error 事件的处理程序。要创建应用程序范围的错误处理程序,请在 Global.asax
文件中将代码添加到 Application_Error 方法。只要您的页或应用程序中发生未处理的异常,就会调用这些方法。您可以从
HttpServerUtility.GetLastError 方法获取有关最新错误的信息。
注意   如果您具有全局错误处理程序,则它优先于在 Web.config customErrors 元素的 defaultRedirect 属性中指定的错误处理。

原则(MSDN):在您的应用程序显示错误信息时,它不应该泄露有助于恶意用户攻击您系统的信息。例如,如果您的应用程序试图登录数据库时没有成功,则显示的错误信息不应该包括它正在使用的用户名。

有许多方法可以控制错误信息:

将应用程序配置为不向远程(应用程序)用户显示详细错误信息。您也可以选择将错误重定向到应用程序页。
只要可行就包括错误处理,并编写您自己的错误信息。在您的错误处理程序中,您可以进行测试以确定用户是否为本地用户并作出相应的响应。
在捕捉所有未处理异常并将它们发送到一般错误页的页级别或应用程序级别上,创建全局错误处理程序。这样,即使您没有预料到某个问题,至少用户不会看到异常页。

<一>页面级的错误处理

{
    String message = "<font face=verdana color=red>"
                           + "<h4>" + Request.Url.ToString() + "</h4>"
                           + "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
                           + "</font>";

    Response.Write(message);
    Server.ClearError();
}

注:通过使用 Server 对象访问来自服务器的错误信息。特别地,该示例从 Request 对象获取请求的 URL,以及 Server
对象的最新错误(使用 GetLastError 方法),并将这两者都转换为客户端可以显示的字符串。将 message 变量写入客户端后,通过使用
ClearError 方法删除该错误

<二>应用程序级的错误事件中,错误处理方式如下:global.asax文件中的application_error中添加处理 逻辑,可添加其它操作,如写入windows事件日志,发邮件给管理员,将错误信息写入数据库。具体如下:

protected void Application_Error(Object sender, EventArgs e)
 2        {
 3            String Message = "\n\nURL:\n http://localhost/" + Request.Path
 4                + "\n\nMESSAGE:\n " + Server.GetLastError().Message
 5                + "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
 6            //写入windows事件日志
 7            String LogName = "Application";
 8            if (!EventLog.SourceExists(LogName)) 
 9            {
10                EventLog.CreateEventSource(LogName, LogName);
11            }
12            EventLog Log = new EventLog();
13            Log.Source = LogName;
14            Log.WriteEntry(Message, EventLogEntryType.Error);
15        }

<三>web.config中,自定义错误信息。将应用程序配置为不向远程用户显示错误

customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx"> 
   <error statusCode="404" redirect="NoSuchPage.aspx"/> 
   <error statusCode="403" redirect="NoAccessAllowed.aspx"/> 
</customErrors>

注:将 mode 属性设置为 RemoteOnly(区分大小写)。这就将应用程序配置为仅向本地用户(您和开发人员)显示详细的错误。
(可选)包括指向应用程序错误页的 defaultRedirect 属性。
(可选)包括将错误重定向到特定页的 <error> 元素。例如,您可以将标准 404 错误(未找到页)重定向到您自己的应用程序页。

<四> 包括错误处理 (MSDN)
1.在可能产生错误的任何语句前后使用 try-catch-finally 块。
2.(可选)使用 Context 对象的 UserHostAddress 属性对本地用户进行测试并相应地修改错误处理。值 127.0.0.1 等效于“localhost”并指示浏览器与 Web 服务器位于同一台计算机上。
  
下面显示的是一个示例错误处理块。如果发生错误,则用有关消息的详细信息加载 Session 状态变量,然后应用程序显示可以读取 Session
变量并显示错误的页。(有意写入此错误以便不向用户提供任何可利用的详细信息。)如果用户是本地用户,则提供不同的错误详细信息。在 finally
块中,释放开放式资源。

try
 2{
 3    sqlConnection1.Open();
 4    sqlDataAdapter1.Fill(dsCustomers1);
 5}
 6catch (Exception ex)
 7{
 8    if(HttpContext.Current.Request.UserHostAddress == "127.0.0.1")
 9    { Session["CurrentError"] = ex.Message; }
10    else
11    { Session["CurrentError"] = "Error processing page."; }
12    Server.Transfer("ApplicationError.aspx");
13}
14finally 
15{
16    this.sqlConnection1.Close();
17}

您也可以创建一个这样的错误处理程序,它在页面级别上或为整个应用程序捕捉所有未处理的异常。
 ==================

在Asp.net开发过程中,我们会遇到很多Exception,不处理这些Exception的话会出现很难看的页面。
还有一些我们未预料到的Exception,当发生Exception时,我们也必须进行记录具体位置,以便我们修正错误。
asp.net异常处理的位置大概有以下3个地方
1. 程序的代码段中,这是最直接处理异常的地方。如下
try
{
    n=Convert.ToInt32(info);
}
catch(Exception)
{
}
只是最基本处理异常的地方。

2. ASP.NET的中的Application_Error中.Application_Error 事件。对于应用程序中引发的任何未处理异常都会引发此事件。一般我们处理如下
protected void Application_Error(Object sender, EventArgs e)
  {
   Exception exp=Server.GetLastError();
   //ErrorLog.Log(exp);
   //====================================
   string strE="内部错误:"+e.InnerException.ToString()+"\r\n堆栈:"+e.StackTrace+"\r "+"Message:"+e.Message+"\r 来源:"+e.Source;
   Log(strE);
                        Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }
这样我们就可以处理Server端出现的错误。我们记录出错的源头。

3. 也可以在页级别或者应用程序级别处理代码错误。Page 基类公开了一个 Page_Error 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。
void Page_Error(Object source, EventArgs e) {
    String message = "<font face=verdana color=red>"
        + "<h4>" + Request.Url.ToString() + "</h4>"
        + "<pre><font color='red'>"
        + Server.GetLastError().ToString() + "</pre>"
        + "</font>";

Response.Write(message);
}

下面我讲述一下怎么在ASP.NET程序里面统一的处理异常,我们以最常见的Session过期为例

我们先写一个Session过期的异常
public class YSessionException:Exception
{
}

我们再定义一个属性
public int SessionValue
{
     get{ if(Session["SessionValue"]==null)
            {
                throw new YSessionException("");
             }
          }
}

下面我们在Page_Error或者Application_Error中处理这个异常
  {
   Exception exp=Server.GetLastError();
                        if(exp is YSessionException)
                        {
                               ..................
                        }
                        Server.ClearError();
   Server.Transfer("Error.aspx",false);
  }

这样就可以为我们程序提供很好的Exception处理界面。

ASP.NET错误处理的方式(总结)的更多相关文章

  1. ASP.NET错误处理的方式(一)

    对Web应用程序来说,发生不可预知的错误和异常在所难免,我们必须为Web程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ...

  2. ASP.NET错误处理的方式(二)

    要创建页中的全局处理程序,请创建 Page_Error 事件的处理程序.要创建应用程序范围的错误处理程序,请在 Global.asax 文件中将代码添加到 Application_Error 方法.只 ...

  3. ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式

    由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得 ...

  4. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  5. asp.net错误页和asp.net mvc错误页设置

    asp.net错误页 在日常项目开发过程中,我们需要给网站设置错误页和记录错误日志. 首先,在项目中添加全局应用程序类 在Global.asax中 protected void Application ...

  6. 解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the system administrator

    原文:解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the syste ...

  7. asp.net core 自定义认证方式--请求头认证

    asp.net core 自定义认证方式--请求头认证 Intro 最近开始真正的实践了一些网关的东西,最近写几篇文章分享一下我的实践以及遇到的问题. 本文主要介绍网关后面的服务如何进行认证. 解决思 ...

  8. 网站后台登录asp 提示错误号:-2147467259

    方法/步骤   1 asp 提示错误号:-2147467259 提示:[] 错误号:-2147467259 错误描述:操作必须使用一个可更新的查询. SQL错误 解决方法  把data文件夹的权限改下 ...

  9. ASP.net的身份验证方式有哪些?

    [转] ASP.net的身份验证方式有哪些?分别是什么原理? Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验 ...

随机推荐

  1. R语言学习笔记:因子

    R语言中的因子就是factor,用来表示分类变量(categorical variables),这类变量不能用来计算而只能用来分类或者计数. 可以排序的因子称为有序因子(ordered factor) ...

  2. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q111-Q114)

    Question 111You create a custom page layout that contains the following code segment. (Line numbers ...

  3. swift GCD使用指南

    swift GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适 ...

  4. 使用VideoView自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  5. 网络开始---多线程---NSThread-01-基本使用(了解)(二)

    #import "HMViewController.h" @interface HMViewController () @end @implementation HMViewCon ...

  6. iOS开发Facebook POP动效库使用教程

    如果说Origami这款动效原型工具是Facebook Paper的幕后功臣,那么POP便是Origami的地基.感谢Facebook开源了POP动效库,让人人都能制作出华丽的动效.我们只需5步,便能 ...

  7. RxJava结合Retrofit和Volley简单比较

    通过使用Retrofit+RxJava和Volley获取知乎日报消息,比较两者的使用区别. 文中 RR:代指Retrofit+Rxjava 主要两个方面使用 使用两者获取Json数据,使用Gson解析 ...

  8. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  9. 利用eclipse抽取 代码片段为方法

    选取要被抽取成方法的代码片段,右键->Refactor--->Extract Method 填写方法名称     抽取后成了这个样子:

  10. 这些git技能够你用一年了

    用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回复交流. git设置关闭自动换行 git config ...