【问题标题】:How to catch the error message on Runtime error in ASP.NET MVC C#如何在 ASP.NET MVC C# 中捕获有关运行时错误的错误消息
【发布时间】:2020-11-10 14:05:52
【问题描述】:

请帮助我在我的 MVC ASP.NET C# 应用程序上捕获错误消息 我的应用程序在我的开发机器上完美运行,但是当我在服务器上发布和部署它时 我总是收到以下错误。 我想捕捉确切的错误信息 我已经在使用 log4net 进行日志记录,但没有来自此错误的日志

“/”应用程序中的服务器错误。

运行时错误 说明:服务器上发生应用程序错误。此应用程序的当前自定义错误设置可防止远程查看应用程序错误的详细信息(出于安全原因)。但是,本地服务器计算机上运行的浏览器可以查看它。

详细信息:要使此特定错误消息的详细信息可以在远程计算机上查看,请在位于当前网站根目录的“web.config”配置文件中创建一个标签应用。然后,此标记应将其“模式”属性设置为“关闭”。

<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

注意事项:您看到的当前错误页面可以通过修改应用程序配置标签的“defaultRedirect”属性以指向自定义错误页面 URL 来替换为自定义错误页面。

<!-- Web.Config Configuration File -->

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
    </system.web>
</configuration>

【问题讨论】:

  • 我已经在我的 web.config 文件中包含了 但我想捕捉错误消息

标签: c# asp.net .net model-view-controller


【解决方案1】:

捕获“现场”错误的一种方法是创建一个异常处理程序并将异常详细信息发送到有用的地方(在我的例子中是一个 Slack 通道,但您可以只使用文本文件)

首先,设置事件处理程序(在 Main() 或启动时运行的其他地方)

// to only catch when not debugging
if (!System.Diagnostics.Debugger.IsAttached)
{
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

     //to catch anywhere in the application
     Application.ThreadException += new ThreadExceptionEventHandler(CurrentDomain_UnhandledException);
}

然后设置您的异常处理程序以将异常详细信息发布到有用的地方。可能是文本文件,我使用的是 Slack WebHooks

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                SlackClient slackClient = new SlackClient("Your-Webhooks-URL");
                SlackMessage message = new SlackMessage
                {
                    Text = (e.ExceptionObject as Exception).Message.ToString() + "\n" + (e.ExceptionObject as Exception).StackTrace.ToString()
                };
                slackClient.Post(message);
                throw e.ExceptionObject as Exception;
            }

如果您想在应用程序的任何地方捕获异常,您也可以设置第二个处理程序来捕获ThreadExceptionEventArgs。重载CurrentDomain_UnhandledException

static void CurrentDomain_UnhandledException(object sender, ThreadExceptionEventArgs e)
        {
            SlackClient slackClient = new SlackClient("Your-Webhooks-URL");
            SlackMessage message = new SlackMessage
            {
                Text = e.Exception.Message.ToString() + "\n" + e.Exception.StackTrace.ToString()
            };
            slackClient.Post(message);
            throw e.Exception;
        }

对于 Slack 消息传递,我在 NuGet 上使用 Slack.Webhooks https://www.nuget.org/packages/Slack.Webhooks/1.1.4

【讨论】:

  • 嗨 madmonk46,谢谢你的回答,我会试试你的建议。非常感谢
  • @RG 对此要记住的一件事是确保异常处理程序中的代码本身不会抛出任何未处理的异常,否则您将得到一个StackOverflowException,它将出现在有些点并不能说明问题出在哪里
  • @R.G 此应用程序是否正常工作?我正在考虑自己部署一个小型 ASP 应用程序,所以我想知道它是否有效
猜你喜欢
  • 2012-04-15
  • 2011-02-04
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多