⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handlingerrs.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 2 页
字号:
  </JsTemplate>
</Acme:LangSwitch>
<p>


<!--BEGIN SUB SECTION--> <a name="handlerr"><span class="subhead">以编程方式处理错误</span>
<p>

也可以在页级别或者应用程序级别处理代码错误。<b>Page</b> 基类公开了一个 <b>Page_Error</b> 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。

<p>
<Acme:TabControl runat="server">
<Tab Name="C#">
&ltscript language="C#" runat="server"&gt;

void Page_Error(Object source, EventArgs e) {
    String message = "&lt;font face=verdana color=red&gt;"
                           + "&lt;h4&gt;" + Request.Url.ToString() + "&lt;/h4&gt;"
                           + "&lt;pre&gt;&lt;font color='red'&gt;" + Server.GetLastError().ToString() + "&lt;/pre&gt;"
                           + "&lt;/font&gt;";

    Response.Write(message);
}

&lt/script&gt;
</Tab>
<Tab Name="VB">
&ltscript language="C#" runat="server"&gt;

Sub Page_Error(Source As Object, E As EventArgs)
    Dim message As String = "&lt;font face=verdana color=red&gt;" _
                           & "&lt;h4&gt;" & Request.Url.ToString() & "&lt;/h4&gt;" _
                           & "&lt;pre&gt;&lt;font color='red'&gt;" & Server.GetLastError().ToString() & "&lt;/pre&gt;" _
                           & "&lt;/font&gt;"

    Response.Write(message)
End Sub

&lt/script&gt;
</Tab>
<Tab Name="JScript">
&ltscript language="JScript" runat="server"&gt;

function Page_Error(source:Object, e:EventArgs) : void {
    var message:String = "&lt;font face=verdana color=red&gt;"
                           + "&lt;h4&gt;" + Request.Url.ToString() + "&lt;/h4&gt;"
                           + "&lt;pre&gt;&lt;font color='red'&gt;" + Server.GetLastError().ToString() + "&lt;/pre&gt;"
                           + "&lt;/font&gt;";

    Response.Write(message);
}

&lt/script&gt;
</Tab>
</Acme:TabControl>
<p>
下面的示例说明 <b>Page_Error</b> 方法。
<p>
<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/CS/error2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error2.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="C# Error2.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/VB/error2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error2.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="VB Error2.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/JS/error2.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error2.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="JScript Error2.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
可以用此方法做一些有用的事情,如向站点管理员发送电子邮件,告知该页未能正确执行。为此,ASP.NET 在 <b>System.Web.Mail</b> 命名空间中提供了一个类集。若要导入此命名空间,请在页顶部使用 <b>@Import</b> 指令,如下所示:
<p>

<div class="code"><pre>
&lt;%@ Import Namespace="System.Web.Mail" %&gt;
</pre></div>

<p>
然后可以使用 <b>MailMessage</b> 和 <b>SmtpMail</b> 对象以编程方式发送电子邮件。
<p>

<Acme:TabControl runat="server">
<Tab Name="C#">
MailMessage mail = new MailMessage();
mail.From = "automated@yourservername.com";
mail.To = "administrator@yourservername.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
</Tab>
<Tab Name="VB">
Dim mail As New MailMessage
mail.From = "automated@yourservername.com"
mail.To = "administrator@yourservername.com"
mail.Subject = "Site Error"
mail.Body = message
mail.BodyFormat = MailFormat.Html
SmtpMail.Send(mail)
</Tab>
<Tab Name="JScript">
var mail:MailMessage = new MailMessage();
mail.From = "automated@yourservername.com";
mail.To = "administrator@yourservername.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
</Tab>
</Acme:TabControl>

<p>
下面的示例说明如何发送邮件信息以响应页错误。
<p><b>注意:</b>除非已在计算机上配置了 SMTP 邮件服务,否则该示例不会真正发送邮件。有关 SMTP 邮件服务的更多信息,请参考 IIS 文档。
<p>

<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/CS/error3.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error3.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="C# Error3.aspx"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/VB/error3.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error3.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="VB Error3.aspx"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  RunSample="/quickstart/aspplus/samples/apps/errors/handlerr/JS/error3.aspx"
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/error3.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="JScript Error3.aspx"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>
除了在页级别处理错误外,可能还需要在应用程序级别处理错误。为此,请使用 <a href="globalasax.aspx">Global.asax</a> 中的 <b>Application_Error</b> 事件。对于应用程序中引发的任何未处理异常都会引发此事件。
<p>

<Acme:TabControl HtmlEncode runat="server">
<Tab Name="C#">
void Application_Error(Object sender, EventArgs e) {
    //...Do something here
}
</Tab>
<Tab Name="VB">
Sub Application_Error(sender As Object, e As EventArgs)
    '...Do something here
End Sub
</Tab>
<Tab Name="JScript">
function Application_Error(sender:Object, e:EventArgs) : void {
    //...Do something here
}
</Tab>
</Acme:TabControl>
<p>

<!--BEGIN SUB SECTION--> <a name="evtlog"><span class="subhead">写入事件日志</span>

<p>
<b>System.Diagnostics</b> 命名空间提供了写入 Windows 事件日志的类。若要在页中使用此命名空间,必须先导入此命名空间,如下所示:

<p>
<div class="code"><pre>
&lt;%@ Import Namespace="System.Diagnostics"%&gt;
</pre></div>
<p>

<b>EventLog</b> 类封装日志本身。它提供了检测或创建日志的静态方法,并且可被实例化以从代码写入日志项。下面的示例说明了 Global.asax 的 <b>Application_Error</b> 方法中的此功能。每当应用程序中发生未处理的异常时,包含错误信息和堆栈跟踪的项便写入应用程序日志。

<p>
<Acme:TabControl HtmlEncode runat="server">
<Tab Name="C#">
void Application_Error(Object sender, EventArgs e) {

     String Message = "\n\nURL:\n http://localhost/" + Request.Path
                            + "\n\nMESSAGE:\n " + Server.GetLastError().Message
                            + "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;

     // Create event Log if it does not exist

     String LogName = "Application";
     if (!EventLog.SourceExists(LogName)) {
        EventLog.CreateEventSource(LogName, LogName);
     }

     // Insert into event log
     EventLog Log = new EventLog();
     Log.Source = LogName;
     Log.WriteEntry(Message, EventLogEntryType.Error);

}
</Tab>
<Tab Name="VB">
Sub Application_Error(sender As Object, e As EventArgs)

     Dim Message As String = "\n\nURL:\n http://localhost/" & Request.Path _
                                       & "\n\nMESSAGE:\n " & Server.GetLastError().Message _
                                       & "\n\nSTACK TRACE:\n" & Server.GetLastError().StackTrace

    ' Create event log if it does not exist

     Dim LogName As String = "Application"
     If (Not EventLog.SourceExists(LogName))
        EventLog.CreateEventSource(LogName, LogName)
     End If

     ' Insert into event log
     Dim Log As New EventLog
     Log.Source = LogName
     Log.WriteEntry(Message, EventLogEntryType.Error)

End Sub
</Tab>
<Tab Name="JScript">
function Application_Error(sender:Object, e:EventArgs) : void {

     var Message:String = "\n\nURL:\n http://localhost/" + Request.Path
                            + "\n\nMESSAGE:\n " + Server.GetLastError().Message
                            + "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;

     // Create event log if it does not exist

     var LogName:String = "Application";
     if (!EventLog.SourceExists(LogName)) {
        EventLog.CreateEventSource(LogName, LogName);
     }

     // Insert into event log
     var Log:EventLog = new EventLog();
     Log.Source = LogName;
     Log.WriteEntry(Message, EventLogEntryType.Error);

}
</Tab>
</Acme:TabControl>
<p>

上述示例的完整源代码如下。注意:此代码被禁用以便它不能在这里运行,这样可防止向 Windows 事件日志写入项。如果希望看到此代码的运行情况,请创建一个指向包含此文件的目录的 IIS 虚拟根。

<p>
<Acme:LangSwitch runat="server">
  <CsTemplate>
<Acme:SourceRef
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/evtlog.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="C# Global.asax"
  runat="server" />
  </CsTemplate>
  <VbTemplate>
<Acme:SourceRef
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/evtlog.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="VB Global.asax"
  runat="server" />
  </VbTemplate>
  <JsTemplate>
<Acme:SourceRef
  ViewSource="/quickstart/aspplus/samples/apps/errors/handlerr/evtlog.src"
  Icon="/quickstart/aspplus/images/genicon.gif"
  Caption="JScript Global.asax"
  runat="server" />
  </JsTemplate>
</Acme:LangSwitch>

<p>

<h4><a name="summary">本节小结</a></h4>
<ol>
<li>错误分为四类:配置错误、分析错误、编译错误和运行时错误。
<li>默认情况下,为运行时错误显示的信息是调用堆栈(导致异常的过程调用链)。如果启用了调试模式,ASP.NET 将显示源代码中发生运行时错误的行号。
<li>ASP.NET 使您能够指定是向本地客户端、远程客户端还是这两者显示错误。默认情况下,仅向本地客户端(即服务器所在的同一计算机上的客户端)显示错误。也可以指定自定义错误页,以在发生错误时将客户端重定向到该页。
<li>除了将所有的错误重定向到一个公共页外,还可以将特定的错误页分配给特定的错误状态代码。<b>&lt;customerrors&gt;</b> 配置节支持内部 <b>&lt;error&gt;</b> 标记,该标记使 HTTP 状态代码与自定义错误页关联。
<li>可以在页级别或者应用程序级别处理代码错误。<b>Page</b> 基类公开了一个 <b>HandleError</b> 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。
<li><b>System.Web.Mail</b> 命名空间公开以编程方式发送电子邮件的类。这对于在发生错误时通知管理员很有用。
<li>除了在页级别处理错误外,还可以使用 Global.asax 中的 <b>Application_Error</b> 事件处理应用程序级别的错误。对于应用程序中引发的任何未处理异常都会引发此事件。
<li><b>System.Diagnostics</b> 命名空间提供了写入 Windows 事件日志的类。
</ol>
<p>

<!-- #include virtual="/quickstart/include/footer.inc" --> <!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -