asp.net自定义错误页面
ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件、Application_Error 事件以及应用程序配置文件 (Web.config)。
如果您不调用 Server.ClearError 或者捕获 Page_Error 或 Application_Error 事件中的错误,则将根据 Web.config 文件的 <customErrors> 部分中的设置处理错误。在 <customErrors> 部分,可将重定向页指定为默认的错误页 (defaultRedirect) 或者根据引发的 HTTP 错误代码指定特定页。您可使用此方法自定义用户收到的错误信息。
尽管您可在 <customErrors> 部分中 defaultRedirect 属性的值中引用默认的错误页,但是您还可根据引发的 HTTP 错误代码指定要重定向到的特定页。<error> 子元素允许使用此选项
<customErrors mode="On" defaultRedirect="ApplicationErroy.aspx">
<error statusCode="403" redirect="403.htm"/>
<error statusCode="404" redirect="404.htm"/>
<error statusCode="500" redirect="500.htm"/>
</customErrors>
asp.net自定义错误处理页面方法一:
1、添加Web.config, <system.web></system.web>中添加<customErrors mode="On" defaultRedirect="ApplicationErroy.aspx" ></customErrors>节点,
2、添加错误处理页面:ApplicationErroy.aspx调用下面的方法:
private void DealErroy()
{
HttpException erroy = new HttpException();
string strCode = erroy.ErrorCode.ToString();
string strMsg = erroy.Message;
erroy.HelpLink = "sss";
Response.Write("ErrorCode:" + strCode + "<br>");
Response.Write("Message:" + strMsg + "<br>");
Response.Write("HelpLink:" + erroy.HelpLink + "<br>");
Response.Write("Source:" + erroy.Source + "<br>");
Response.Write("TargetSite:" + erroy.TargetSite + "<br>");
Response.Write("InnerException:" + erroy.InnerException + "<br>");
Response.Write("StackTrace:" + erroy.StackTrace + "<br>");
Response.Write("GetHtmlErrorMessage:" + erroy.GetHtmlErrorMessage() + "<br>");
Response.Write("erroy.GetHttpCode().ToString():" + erroy.GetHttpCode().ToString() +"<br>");
Response.Write("erroy.Data.ToString()::" + erroy.Data.ToString() + "<br>");
}
这种方法不能完整地显示错误信息;
asp.net自定义错误处理页面方法二:
1、添加Web.config, < system.web>< /system.web>中添加< customErrors mode="On"
defaultRedirect="ApplicationErroy.aspx" >< /customErrors>节点,
2、添加Global.asax文件,找到Application_Error事件,加入以下代码:
//这是添加了一个全局应用程序类 在Application_Error事件中处理错误页面 和web.config没有关系 即使没有web.config也是可以定位到错误页面
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
Exception erroy = Server.GetLastError();
string err = "出错页面是:" + Request.Url.ToString() + "</br>";
err += "异常信息:" + erroy.Message + "</br>";
err += "Source:" + erroy.Source + "</br>";
err += "StackTrace:" + erroy.StackTrace + "</br>";
//清除前一个异常
Server.ClearError();
//此处理用Session["ProError"]出错。所以用 Application["ProError"]
Application["erroy"] = err;
//此处不是page中,不能用Response.Redirect("../frmSysError.aspx");
System.Web.HttpContext.Current.Response.Redirect(HttpContext.Current.Request.ApplicationPath +"/ApplicationErroy.aspx");
}
2、添加错误处理页面:ApplicationErroy.aspx 加入以下代码;
protected void Page_Load(object sender, EventArgs e)
{
//显示程序中的错误码
if (!IsPostBack)
{
//显示程序中的错误码
if (Application["erroy"] != null)
{
Response.Write(Application["erroy"].ToString());
}
}
}
这种方法能完整地显示错误信息,
最好的办法还是两种方法一起用最好!
另:web.config中也可以把
<customErrors mode="On" defaultRedirect="ApplicationErroy.aspx">
<error statusCode="403" redirect="403.htm"/>
<error statusCode="404" redirect="404.htm"/>
<error statusCode="500" redirect="500.htm"/>
</customErrors>
添加进去。
http错误代码含义:
"100" : Continue
"101" : witching Protocols
"200" : OK
"201" : Created
"202" : Accepted
"203" : Non-Authoritative Information
"204" : No Content
"205" : Reset Content
"206" : Partial Content
"300" : Multiple Choices
"301" : Moved Permanently
"302" : Found
"303" : See Other
"304" : Not Modified
"305" : Use Proxy
"307" : Temporary Redirect
"400" : Bad Request
"401" : Unauthorized
"402" : Payment Required
"403" : Forbidden
"404" : Not Found
"405" : Method Not Allowed
"406" : Not Acceptable
"407" : Proxy Authentication Required
"408" : Request Time-out
"409" : Conflict
"410" : Gone
"411" : Length Required
"412" : Precondition Failed
"413" : Request Entity Too Large
"414" : Request-URI Too Large
"415" : Unsupported Media Type
"416" : Requested range not satisfiable
"417" : Expectation Failed
"500" : Internal Server Error
"501" : Not Implemented
"502" : Bad Gateway
"503" : Service Unavailable
"504" : Gateway Time-out
"505" : HTTP Version not supported
HTTP 400 - 请求无效
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
HTTP 403 - 禁止访问
HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
HTTP 404.1 - 无法找到 Web 站点
HTTP 404 - 无法找到文件
HTTP 405 - 资源被禁止
HTTP 406 - 无法接受
HTTP 407 - 要求代理身份验证
HTTP 410 - 永远不可用
HTTP 412 - 先决条件失败
HTTP 414 - 请求 - URI 太长
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
概要
当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。该状态代码记录在 IIS 日志中,同时也可能在 Web 浏览器或 FTP 客户端显示。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。
更多信息
日志文件的位置
在默认状态下,IIS 把它的日志文件放在 %WINDIR\System32\Logfiles 文件夹中。每个万维网 (WWW) 站点和 FTP 站点在该目录下都有一个单独的目录。在默认状态下,每天都会在这些目录下创建日志文件,并用日期给日志文件命名(例如,exYYMMDD.log)。
HTTP
1xx - 信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。 100 - 继续。
101 - 切换协议。
2xx - 成功
这类状态代码表明服务器成功地接受了客户端请求。 200 - 确定。客户端请求已成功。
201 - 已创建。
202 - 已接受。
203 - 非权威性信息。
204 - 无内容。
205 - 重置内容。
206 - 部分内容。
3xx - 重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 302 - 对象已移动。
304 - 未修改。
307 - 临时重定向。
4xx - 客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。
400 - 错误的请求。
401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: 401.1 - 登录失败。
401.2 - 服务器配置导致登录失败。
401.3 - 由于 ACL 对资源的限制而未获得授权。
401.4 - 筛选器授权失败。
401.5 - ISAPI/CGI 应用程序授权失败。
401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。
403 - 禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因: 403.1 - 执行访问被禁止。
403.2 - 读访问被禁止。
403.3 - 写访问被禁止。
403.4 - 要求 SSL。
403.5 - 要求 SSL 128。
403.6 - IP 地址被拒绝。
403.7 - 要求客户端证书。
403.8 - 站点访问被拒绝。
403.9 - 用户数过多。
403.10 - 配置无效。
403.11 - 密码更改。
403.12 - 拒绝访问映射表。
403.13 - 客户端证书被吊销。
403.14 - 拒绝目录列表。
403.15 - 超出客户端访问许可。
403.16 - 客户端证书不受信任或无效。
403.17 - 客户端证书已过期或尚未生效。
403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。
403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。
403.20 - Passport 登录失败。这个错误代码为 IIS 6.0 所专用。
404 - 未找到。 404.0 -(无) – 没有找到文件或目录。
404.1 - 无法在所请求的端口上访问 Web 站点。
404.2 - Web 服务扩展锁定策略阻止本请求。
404.3 - MIME 映射策略阻止本请求。
405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许)
406 - 客户端浏览器不接受所请求页面的 MIME 类型。
407 - 要求进行代理身份验证。
412 - 前提条件失败。
413 – 请求实体太大。
414 - 请求 URI 太长。
415 – 不支持的媒体类型。
416 – 所请求的范围无法满足。
417 – 执行失败。
423 – 锁定的错误。
5xx - 服务器错误
服务器由于遇到错误而不能完成该请求。 500 - 内部服务器错误。 500.12 - 应用程序正忙于在 Web 服务器上重新启动。
500.13 - Web 服务器太忙。
500.15 - 不允许直接请求 Global.asa。
500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100 - 内部 ASP 错误。
501 - 页眉值指定了未实现的配置。
502 - Web 服务器用作网关或代理服务器时收到了无效响应。 502.1 - CGI 应用程序超时。
502.2 - CGI 应用程序出错。application.
503 - 服务不可用。这个错误代码为 IIS 6.0 所专用。
504 - 网关超时。
505 - HTTP 版本不受支持。
常见的 HTTP 状态代码及其原因
200 - 成功。 此状态代码表示 IIS 已成功处理请求。
304 - 未修改。 客户端请求的文档已在其缓存中,文档自缓存以来尚未被修改过。客户端使用文档的缓存副本,而不从服务器下载文档。
401.1 - 登录失败。 登录尝试不成功,可能因为用户名或密码无效。
401.3 - 由于 ACL 对资源的限制而未获得授权。 这表示存在 NTFS 权限问题。即使您对试图访问的文件具备相应的权限,也可能发生此错误。例如,如果 IUSR 帐户无权访问 C:\Winnt\System32\Inetsrv 目录,您会看到这个错误。 有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
187506 INFO: IIS 4.0 的基础 NTFS 权限
403.1 - 执行访问被禁止。 下面是导致此错误信息的两个常见原因: 您没有足够的执行许可。例如,如果试图访问的 ASP 页所在的目录权限设为“无”,或者,试图执行的 CGI 脚本所在的目录权限为“只允许脚本”,将出现此错误信息。若要修改执行权限,请在 Microsoft 管理控制台 (MMC) 中右击目录,然后依次单击属性和目录选项卡,确保为试图访问的内容设置适当的执行权限。
您没有将试图执行的文件类型的脚本映射设置为识别所使用的谓词(例如,GET 或 POST)。若要验证这一点,请在 MMC 中右击目录,依次单击属性、目录选项卡和配置,然后验证相应文件类型的脚本映射是否设置为允许所使用的谓词。
403.2 - 读访问被禁止。验证是否已将 IIS 设置为允许对目录进行读访问。另外,如果您正在使用默认文件,请验证该文件是否存在。 有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
247677 错误信息:403.2 Forbidden:Read Access Forbidden(403.2 禁止访问:读访问被禁止)
403.3 - 写访问被禁止。 验证 IIS 权限和 NTFS 权限是否已设置以便向该目录授予写访问权。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
248072 错误信息:403.3 Forbidden:Write Access Forbidden(403.3 禁止访问:写访问被禁止)
403.4 - 要求 SSL。禁用要求安全通道选项,或使用 HTTPS 代替 HTTP 来访问该页面。如果没有安装证书的 Web 站点出现此错误,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
224389 错误信息:HTTP 错误 403、403.4、403.5 禁止访问:要求 SSL
403.5 - 要求 SSL 128。禁用要求 128 位加密选项,或使用支持 128 位加密的浏览器以查看该页面。如果没有安装证书的 Web 站点出现此错误,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
224389 错误信息:HTTP 错误 403、403.4、403.5 禁止访问:要求 SSL
403.6 - IP 地址被拒绝。您已把您的服务器配置为拒绝访问您目前的 IP 地址。 有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
248043 错误信息:403.6 - Forbidden:IP Address Rejected(403.6 - 不可用:IP 地址被拒绝)
403.7 - 要求客户端证书。您已把您的服务器配置为要求客户端身份验证证书,但您未安装有效的客户端证书。 有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
190004 错误 403.7 或“Connection to Server Could Not Be Established”(无法建立与服务器的连接)
186812 PRB:错误信息:403.7 Forbidden:Client Certificate Required(403.7 禁止访问:要求客户端证书)
403.8 - 站点访问被拒绝。您已为您用来访问服务器的域设置了域名限制。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:
248032 错误信息:Forbidden:Site Access Denied 403.8(禁止访问:站点访问被拒绝 403.8)
403.9 - 用户数过多。与该服务器连接的用户数量超过了您设置的连接限制。 有关如何更改此限制的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
248074 错误信息:Access Forbidden:Too Many Users Are Connected 403.9(禁止访问:连接的用户太多 403.9)
注意:Microsoft Windows 2000 Professional 和 Microsoft Windows XP Professional 自动设置了在 IIS 上最多 10 个连接的限制。您无法更改此限制。
403.12 - 拒绝访问映射表。 您要访问的页面要求提供客户端证书,但映射到您的客户端证书的用户 ID 已被拒绝访问该文件。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
248075 错误信息:HTTP 403.12 - Access Forbidden:Mapper Denied Access(HTTP 403.12 - 禁止访问:映射表拒绝访问)
404 - 未找到。 发生此错误的原因是您试图访问的文件已被移走或删除。如果在安装 URLScan 工具之后,试图访问带有有限扩展名的文件,也会发生此错误。这种情况下,该请求的日志文件项中将出现“Rejected by URLScan”的字样。
500 - 内部服务器错误。 很多服务器端的错误都可能导致该错误信息。事件查看器日志包含更详细的错误原因。此外,您可以禁用友好 HTTP 错误信息以便收到详细的错误说明。 有关如何禁用友好 HTTP 错误信息的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
294807 如何在服务器端禁用 Internet Explorer 5 的“显示友好 HTTP 错误信息”功能
500.12 - 应用程序正在重新启动。 这表示您在 IIS 重新启动应用程序的过程中试图加载 ASP 页。刷新页面后,此信息即会消失。如果刷新页面后,此信息再次出现,可能是防病毒软件正在扫描 Global.asa 文件。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
248013 错误信息:HTTP Error 500-12 Application Restarting(HTTP 错误 500-12 应用程序正在重新启动)
500-100.ASP - ASP 错误。 如果试图加载的 ASP 页中含有错误代码,将出现此错误信息。若要获得更确切的错误信息,请禁用友好 HTTP 错误信息。默认情况下,只会在默认 Web 站点上启用此错误信息。有关如何在非默认的 Web 站点上看到此错误信息的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
261200 显示 HTTP 500 错误信息,而不显示 500-100.asp 的 ASP 错误信息
502 - 网关错误。 如果试图运行的 CGI 脚本不返回有效的 HTTP 标头集,将出现此错误信息。
FTP
1xx - 肯定的初步答复
这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 110 重新启动标记答复。
120 服务已就绪,在 nnn 分钟后开始。
125 数据连接已打开,正在开始传输。
150 文件状态正常,准备打开数据连接。
2xx - 肯定的完成答复
一项操作已经成功完成。客户端可以执行新命令。 200 命令确定。
202 未执行命令,站点上的命令过多。
211 系统状态,或系统帮助答复。
212 目录状态。
213 文件状态。
214 帮助消息。
215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
220 服务就绪,可以执行新用户的请求。
221 服务关闭控制连接。如果适当,请注销。
225 数据连接打开,没有进行中的传输。
226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
230 用户已登录,继续进行。
250 请求的文件操作正确,已完成。
257 已创建“PATHNAME”。
3xx - 肯定的中间答复
该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。 331 用户名正确,需要密码。
332 需要登录帐户。
350 请求的文件操作正在等待进一步的信息。
4xx - 瞬态否定的完成答复
该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
425 无法打开数据连接。
426 Connection closed; transfer aborted.
450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
451 请求的操作异常终止:正在处理本地错误。
452 未执行请求的操作。系统存储空间不够。
5xx - 永久性否定的完成答复
该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。
500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
501 在参数中有语法错误。
502 未执行命令。
503 错误的命令序列。
504 未执行该参数的命令。
530 未登录。
532 存储文件需要帐户。
550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
551 请求的操作异常终止:未知的页面类型。
552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
553 未执行请求的操作。不允许的文件名。
常见的 FTP 状态代码及其原因
150 - FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。
226 - 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。
230 - 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。
331 - 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。
426 - 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。
530 - 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。
550 - 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。
asp.net自定义错误处理页面方法三Page_Error事件:
Page_Error 事件提供一种捕获在页级别出现的错误的方法。您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
备注:此示例在浏览器中显示详细的错误信息,提供此示例只是为了进行说明。向应用程序的最终用户显示详细信息(尤其是该应用程序在 Internet 上运行时)一定要小心。更适当的做法是向用户显示一条消息,告知已发生错误,然后将具体的错误详细信息记录在事件日志中。
本示例引发一个强迫错误发生在 Page_Load 事件中的空异常。按照以下步骤可创建将测试 Page_Error 事件的初始页。 1. 按照以下步骤将名为 PageEvent.aspx 的新文件添加到项目中: a. 打开 Microsoft Visual Studio .NET。
b. 在"解决方案资源管理器"中,右键单击该项目节点,指向添加,然后单击添加 Web 窗体。
c. 在名称文本框中,键入 PageEvent.aspx,然后单击打开。
将以下代码添加到 PageEvent.aspx 中:
<script language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
public void Page_Error(object sender,EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string err = "<b>Error Caught in Page_Error event</b><hr><br>" +
"<br><b>Error in:</b>" + Request.Url.ToString() +
"<br><b>Error Message:</b>" + objErr.Message.ToString()+
"<br><b>Stack Trace:</b><br>" +
objErr.StackTrace.ToString();
Response.Write(err.ToString());
Server.ClearError();
}
</script>
从文件菜单中,单击保存 PageEvent.aspx。
右键单击该页,然后单击在浏览器中查看以运行该页。请注意,将按照代码规范引发和报告错误。
备注:您可能注意到代码发出对 Server.ClearError 的调用。这将防止错误继续到要被处理的 Application_Error 事件中。
此外,您还应记下 @ Page 指令中的 Inherits 属性。如果已经设置 Inherits,则必须首先生成项目,然后再浏览到该页。如果不首先生成项目,将看到下面的错误信息: 'Project.PageEvent' is not a valid type
(转)
ASP.NET 在处理和响应错误的方式上进行了若干改进。在传统的 ASP 中,是用"On Error Resume Next"(或在 Jscript 中用 try-catch 块)处理错误的。或者,如果您运行的是 Microsoft Internet Information Services (IIS) 5.0,则使用 ASPError 对象创建自定义的错误报告页。然而,这些方法都有其局限性。
ASP.NET 提供了在运行 ASP.NET 应用程序时可能出现的错误的若干处理和响应级别。ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件、Application_Error 事件以及应用程序配置文件 (Web.config)。
本文演示如何在 ASP.NET 应用程序中使用这些新功能。尽管本文由于与 ASP.NET 直接相关而介绍了如何提供自定义错误页和一般错误报告,但是它并不介绍其他错误处理方法,如 try-catch-finally 块和公共语言运行库 (CLR) 异常系统。
如何使用 Page_Error 事件
Page_Error 事件提供一种捕获在页级别出现的错误的方法。您可以只是显示错误信息(正如下面的示例代码所示),也可以记录事件或执行某个其他操作。
备注:此示例在浏览器中显示详细的错误信息,提供此示例只是为了进行说明。向应用程序的最终用户显示详细信息(尤其是该应用程序在 Internet 上运行时)一定要小心。更适当的做法是向用户显示一条消息,告知已发生错误,然后将具体的错误详细信息记录在事件日志中。
本示例引发一个强迫错误发生在 Page_Load 事件中的空异常。按照以下步骤可创建将测试 Page_Error 事件的初始页。 1. 按照以下步骤将名为 PageEvent.aspx 的新文件添加到项目中: a. 打开 Microsoft Visual Studio .NET。
b. 在"解决方案资源管理器"中,右键单击该项目节点,指向添加,然后单击添加 Web 窗体。
c. 在名称文本框中,键入 PageEvent.aspx,然后单击打开。
2. 将以下代码添加到 PageEvent.aspx 中:
<script language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
public void Page_Error(object sender,EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string err = "<b>Error Caught in Page_Error event</b><hr><br>" +
"<br><b>Error in:</b>" + Request.Url.ToString() +
"<br><b>Error Message:</b>" + objErr.Message.ToString()+
"<br><b>Stack Trace:</b><br>" +
objErr.StackTrace.ToString();
Response.Write(err.ToString());
Server.ClearError();
}
</script>
3. 从文件菜单中,单击保存 PageEvent.aspx。
4. 右键单击该页,然后单击在浏览器中查看以运行该页。请注意,将按照代码规范引发和报告错误。
备注:您可能注意到代码发出对 Server.ClearError 的调用。这将防止错误继续到要被处理的 Application_Error 事件中。
此外,您还应记下 @ Page 指令中的 Inherits 属性。如果已经设置 Inherits,则必须首先生成项目,然后再浏览到该页。如果不首先生成项目,将看到下面的错误信息: 'Project.PageEvent' is not a valid type
如何使用 Application_Error 事件
与 Page_Error 事件相类似,您可使用 Application_Error 事件捕获发生在应用程序中的错误。由于事件发生在整个应用程序范围内,因此您可记录应用程序的错误信息或处理其他可能发生的应用程序级别的错误。
下面的示例基于前面的 Page_Error 事件代码示例,如果 Page_Load 事件中的错误未在 Page_Error 事件中捕获,将引发异常。Application_Error 事件在应用程序的 Global.asax 文件中进行指定。为简单起见,本节中的步骤创建一个要在其中引发异常的新页,捕获 Global.asax 文件的 Application_Error 事件中的错误,并将该错误写入事件日志中。下面的步骤演示如何使用 Application_Error 事件: 1. 将名为 AppEvent.aspx 的新文件添加到项目中:
2. 将以下代码添加到 AppEvent.aspx 中:
<script language=C# runat="server">
void Page_Load(object sender, System.EventArgs e)
{
throw(new ArgumentNullException());
}
</script>
3. 从文件菜单中,单击保存 AppEvent.aspx。
4. 将 Application_Error 事件添加到 Global.asax 文件中以捕获在 AppEvent.aspx 页的 Page_Load 事件中引发的错误。注意,您必须为 System.Diagnostics 名称空间将另一条 using 语句添加到 Global.asax,才能使用事件日志。
将以下代码添加到 Global.asax 文件中:
using System.Diagnostics;
protected void Application_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string err = "Error Caught in Application_Error event/n" +
"Error in:" + Request.Url.ToString() +
"/nError Message:"+ objErr.Message.ToString() +
"/nStack Trace:"+ objErr.StackTrace.ToString();
EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
Server.ClearError();
//additional actions...
}
5. 保存 Global.asax 文件。
6. 在 Visual Studio .NET 中,在生成菜单上,单击生成。
7. 右键单击该页,然后单击在浏览器中查看。在这种情况下该页将为空白,但是您应该注意到在事件日志中已添加了一个新项。本示例在应用程序日志中生成一个项, 可从事件查看器访问应用程序日志。在记录错误之后,您可能希望将用户重定向到另一个更用户友好的错误页或者根据需要执行一些其他操作。
如何使用 Web.config 文件
如果您不调用 Server.ClearError 或者捕获 Page_Error 或 Application_Error 事件中的错误,则将根据 Web.config 文件的 <customErrors> 部分中的设置处理错误。在 <customErrors> 部分,可将重定向页指定为默认的错误页 (defaultRedirect) 或者根据引发的 HTTP 错误代码指定特定页。您可使用此方法自定义用户收到的错误信息。
如果发生在应用程序以前的任一级别都未捕获到的错误,则显示这个自定义页。本节演示如何修改 Global.asax 文件,以便从不调用 Server.ClearError。因此,错误在作为捕获错误的最后一点的 Web.config 文件中进行处理。 1. 从上一个示例中打开 Global.asax 文件。
2. 将 Server.ClearError 行注释掉,以便确保错误出现在 Web.config 文件中。
3. 将所作更改保存到 Global.asax 中。代码看起来应类似如下形式:
using System.Diagnostics;
protected void Application_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string err = "Error Caught in Application_Error event/n" +
"Error in:" + Request.Url.ToString() +
"/nError Message:"+ objErr.Message.ToString() +
"/nStack Trace:"+ objErr.StackTrace.ToString();
EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
//Server.ClearError();
//additional actions...
}
4. 将以下代码添加到 <customErrors> 部分,以便将用户重定向到自定义页:
<customErrors defaultRedirect="errorStatus.htm" mode="On">
</customErrors>
备注:必须修改 defaultRedirect 属性中的文件路径,以便它引用相关的 Web 服务器和应用程序名称。
5. 因为在此级别捕获的错误会发送到默认的错误页,所以,必须创建一个名为 ErrorStatus.htm 的错误页。请记住,您要使用此方法来控制向用户呈现的内容,因此本示例使用 .htm 页作为错误页。将以下代码添加到 ErrorStatus.htm 中:
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
</HEAD>
<BODY>
<b>Custom Error page!</b>
<br>
You have been redirected here from the <customErrors> section of the
Web.config file.
</BODY>
</HTML>
6. 若要测试该代码,请保存这些文件,生成项目,然后在浏览器中查看 AppEvent.aspx。请注意,在引发错误时,您将被重定向到 ErrorStatus.htm 页。
尽管您可在 <customErrors> 部分中 defaultRedirect 属性的值中引用默认的错误页,但是您还可根据引发的 HTTP 错误代码指定要重定向到的特定页。<error> 子元素允许使用此选项。例如:
<customErrors defaultRedirect="errorStatus.htm" mode="On">
<error statusCode="404" redirect="filenotfound.htm" />
</customErrors>
备 注:在 <customErrors> 部分的 defaultRedirect 中指定的页是一个 .htm 文件。如果您打算在 .aspx 页中使用 GetLastError (正如 Page_Error 和 Application_Error 示例那样),则在进行重定向之前,必须将异常存储在会话变量或某个其他方法中。
请注意,<customErrors> 部分包括设置为 On 的 mode 属性。mode 属性用于控制错误重定向发生的方式。例如,如果您正开发应用程序,则很可能希望查看实际的 ASP.NET 错误信息,并且不希望被重定向到更用户友好的错误页。mode 属性包括以下设置: On:未被处理的异常将用户重定向到指定的 defaultRedirect 页。此模式主要用于生产。
Off:用户收到异常信息而不是被重定向到 defaultRedirect 页。此模式主要用于开发。
RemoteOnly:只有在本地计算机上访问该站点的用户(通过使用 localhost)才能收到异常信息。所有其他用户都被重定向到 defaultRedirect 页。此模式主要用于调试。
转自:http://www.cnblogs.com/bingyu/articles/1725033.html
http://blog.csdn.net/tuwen/article/details/4879052
posted on 2017-07-31 10:08 694579350 阅读(4381) 评论(0) 编辑 收藏 举报