asp.net中如何捕获程序错误并将错误原因在页面上显示出来。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net中如何捕获程序错误并将错误原因在页面上显示出来。相关的知识,希望对你有一定的参考价值。

参考技术A ASP.NET允许应用程序出错时显示用户指定的页面,方法是在web.config文件中修改配置信息。
<? xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="ErrorPage.htm" />
</system.web>
</configuration>
上面的配置信息明确指定了当应用程序出错的时候显示用户定制的页面ErrorPage.htm。并且因为各个应用程序有自己独立的web.config配置文件,所以应用程序之间不会互相干扰。
其中,mode属性表示是否启用定制的用户页面,它可取三个值,如下所示:
On 启用定制的出错页面
Off 禁用定制的出错页面
RemoteOnly 启用定制的出错页面但仅展示给远程用户
defaultRedirect属性表示用户定制出错页面的文件名。
<!-- 自定义错误信息
设置customError 模式值可以控制应向
用户显示用户友好错误信息而不是错误详细信息(包括堆栈跟踪信息):
“On”始终显示自定义(友好的)信息
“Off”始终显示详细的 ASP.NET 错误信息。
“RemoteOnly”只对不在本地 Web 服务器上运行的
用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
不向远程客户端显示应用程序的详细信息。
-->注释中说明!
默认下是<customErrors mode="RemoteOnly" />只针对远程用户
后始终显示自定义的页面,而不显示程序的详细信息!本回答被提问者采纳

如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?

【中文标题】如何处理应用程序启动时发生的 ASP.NET 应用程序错误以及 MVC 视图中的传输和显示错误?【英文标题】:How to handle ASP.NET application error that occurs on application start and transfer & display error in MVC view? 【发布时间】:2011-01-25 08:09:39 【问题描述】:

我知道 ASP.NET MVC 有错误过滤器属性来处理指定的错误类型。但是,此功能无法捕获应用程序启动时发生的任何错误。因此,我需要在“Application_Error”方法中添加一些代码来处理此错误,如下面的代码。

public void Application_Error(object sender, EventArgs e)

    // At this point we have information about the error
    var ctx = HttpContext.Current;

    var exception = ctx.Server.GetLastError();

    var errorInfo =
       "<br>Offending URL: " + ctx.Request.Url +
       "<br>Source: " + exception.Source +
       "<br>Message: " + exception.Message +
       "<br>Stack trace: " + exception.StackTrace;

    ctx.Response.Write(errorInfo);

    Server.ClearError();

虽然,当发生正常的应用程序错误(如视图页面中发生的错误)时,此代码可以正常工作。然而,当应用程序启动时发生错误时,它不起作用,因为请求和响应对象始终为空。

接下来,我尝试通过在自定义错误中设置默认重定向来解决这个问题,如以下代码。

<customErrors mode="On" defaultRedirect="Scripts/ApplicationError.htm"></customErrors>

不幸的是,它不起作用,因为当应用程序收到重定向请求时,它会尝试再次启动应用程序并再次抛出异常。

如何解决这个问题?或者,您是否有其他处理此错误的想法。

谢谢,

PS。创建此处理程序的主要原因是我想在应用程序无法连接到其他服务(如数据库)以在应用程序启动时缓存数据时显示错误。

【问题讨论】:

【参考方案1】:

RequestResponse 对象在您的 Application_Error 事件中是 null 的原因是因为 Application_Start 事件没有与任何用户关联,因此您不能从它重定向。只有ApplicationServer 内置对象可用。引用 SessionRequestResponse 对象会导致错误。

一种解决方法是使用try/catch 并在catch 块中记录错误并设置一些全局变量以指示应用程序启动期间出现问题。稍后Application_BeginRequest 你可以检查这个变量并相应地重定向。

【讨论】:

我用来创建一些与您的答案相似的代码。当应用程序错误被触发并将最后一个错误保存到公共静态变量时,我会清除任何错误。之后,我有一些动作过滤器来检查这个变量并在它可用时显示错误。但是,我不喜欢这个主意。因为可能会向其他请求显示错误页面,导致此错误。 不应该有任何其他请求。如果您的应用程序在初始化时失败,我看不到它在失败状态下将如何处理任何请求。唯一的解决方法是解决问题并重新启动应用程序。 我同意如果出现启动错误,后续请求不应发生,因此您需要围绕所有 Application_Start 进行 try/catch。如果您在 BeginRequest 中检查启动异常,是否有比 Response.Redirect 更适合 MVC 的重定向方式?我的重定向方式是 Firefox 所说的不会结束。是否有某种方法可以重定向到发生异常的操作,例如 Error.Startup(ex)。 我已经记不清你的帖子有多少帮助了我。谢谢。

以上是关于asp.net中如何捕获程序错误并将错误原因在页面上显示出来。的主要内容,如果未能解决你的问题,请参考以下文章

如何从像 Asp.Net 这样的堆栈跟踪中获取“源错误”?

在 Asp.net Web API 中捕获 404 错误

MVC如何使用Log4Net进行错误日志记录

如何修复 ASP.NET 中的“此页面无法显示”错误?

ASP.NET MVC中的错误处理

自定义 ASP.NET MVC 404 错误页面的路由