📄 handlingerrs.aspx
字号:
</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#">
<script language="C#" runat="server">
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);
}
</script>
</Tab>
<Tab Name="VB">
<script language="C#" runat="server">
Sub Page_Error(Source As Object, E As EventArgs)
Dim message As String = "<font face=verdana color=red>" _
& "<h4>" & Request.Url.ToString() & "</h4>" _
& "<pre><font color='red'>" & Server.GetLastError().ToString() & "</pre>" _
& "</font>"
Response.Write(message)
End Sub
</script>
</Tab>
<Tab Name="JScript">
<script language="JScript" runat="server">
function Page_Error(source:Object, e:EventArgs) : void {
var message:String = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
</script>
</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>
<%@ Import Namespace="System.Web.Mail" %>
</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>
<%@ Import Namespace="System.Diagnostics"%>
</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><customerrors></b> 配置节支持内部 <b><error></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 + -