为什么我在错误重定向页面中没有得到异常跟踪?

Why I am not getting exception trace in error redirect page?

在我寻求实现最佳自定义错误处理实践的过程中,我想出了一个想法,即不要在我的代码中的任何地方使用 try catch。相反,我决定使用 customErrors mode="On" 并重定向到错误页面并在此页面中显示异常详细信息。

//My test code from which error will come
public ActionResult Index()
    { 
        AAA aa = null;
        aa.a = "a"; 
    }

//My web.config file
 <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
  <error statusCode="404" redirect="~/Errors/404.html" />
</customErrors>

//My error handling page(Error.aspx):
 protected void Page_Load(object sender, EventArgs e)
    {
        Exception error;
        error = Server.GetLastError();            
    }

我相信我应该在错误处理页面中收到错误消息。但我总是得到空值。

如何在错误处理页面获取异常消息?

让我阐明一下我通常如何处理我从事的项目中的异常。但是让我们分成几个部分。

错误页面

错误页面 在生产时 不应显示真正的异常。用户无需知道数据库出现故障,这可能会使您的系统面临安全问题。具有一般错误或记录良好的错误代码的页面可以完成这项工作。 但是,当然,在您的开发环境中可以显示异常。我建议在这种情况下使用 customErrors mode="RemoteOnly"

错误代码

根据您正在开发的系统,消息中包含错误代码很重要。例如,用户可以看到 "Unable to connect (XYZ_1234)""Unable to connect (ABC_9876)" - 相同的消息,不同的代码 - 并将其发送到支持团队。如果支持团队有一份文档与代码与真正的异常相匹配,他们将能够向开发人员发送适当的报告。

Try/Catch 块

Try/Catch 是您处理异常时最好的朋友。特别是因为它会帮助您在必要时自定义异常。您可以有一系列自定义异常 类 - 每个都有自己的特点 - 这将帮助您甚至在调试之前就知道问题所在。一个简单的例子:

public class ExceptionWithCode : Exception
{
    public ExceptionWithCode(string code, string message) : base(message)
    {
        this.Code = code;
    }

    public string Code { get; }
}

在代码中,您应该或多或少地以这种方式处理它:

try
{
    // Do whatever database operation here
}
catch (SqlException ex)
{
    // Log the exception
    _logService.Log(ex);

    // Throw something else to the user
    throw new ExceptionWithCode("XYZ_1234", "Unable to connect");
}
catch (Exception ex)
{
    // Log the exception
    _logService.Log(ex);

    // Throw something else to the user
    throw new ExceptionWithCode("ABC_9876", "Unable to connect");
}

请注意,我使用了 2 个捕获。第一个是因为我知道这个异常可能会发生,因为我正在连接到数据库,第二个是以防万一可能发生任何其他事情。此外,用户不知道真正的异常,因为 he/she 只是得到一个带有代码的随机异常,而不是数据库连接失败。

日志

这是一个非常重要的部分。请记住:您永远不应该向用户显示真正的异常。 相反,将它们记录在您可以轻松访问的地方。这可能在服务器、数据库甚至 Windows 事件日志中的文件中。您不一定需要编写自己的日志记录工具,您可以使用 Internet 上可用的任何工具。我最喜欢 SeriLog, since I log most of my events/exceptions in text files. But I've used ELMAH 一段时间以来使用 .NET Framework,它非常适合 XML 格式的日志。

这对我有用,因为:

  1. 用户被告知问题并可以与支持人员沟通
  2. 我不会向任何入侵者透露我系统的缺陷(至少不是很清楚)
  3. 我知道用户看到了什么样的异常,感谢他给我的错误代码
  4. 有日志可以随时分析