使用GetLastError()来检索自定义异常属性

时间:2014-07-31 16:02:49

标签: c# exception global-asax getlasterror application-error

因此,我创建了一个自定义异常类(让我们称之为CustomException)以及Exception类中找不到的一些自定义属性。在global.asax.cs文件中,只要发生异常就会调用Application_Error方法。我使用Server.GetLastError()来抓取触发Application_Error方法的异常。问题是Server.GetLastError()只抓取Exception对象而不是与其自定义属性一起抛出的CustomException对象。基本上,当CustomException检索时,Exception会被细分为Server.GetLastError()个对象,从而失去与CustomException相关联的自定义属性。

GetLastError()是否有办法真正检索CustomException对象,而不是精简Exception版本?这是为了将错误存储在数据库表中,其中包含的信息比Exception通常提供的信息要多。

Application_Error

protected void Application_Error(object sender, EventArgs e)
{
    // This var is Exception, would like it to be CustomException
    var ex = Server.GetLastError();           

    // Logging unhandled exceptions into the database
    SystemErrorController.Insert(ex);

    string message = ex.ToFormattedString(Request.Url.PathAndQuery);

    TraceUtil.WriteError(message);
}

CustomException

public abstract class CustomException : System.Exception
{        
    #region Lifecycle

    public CustomException ()
        : base("This is a custom Exception.")
    {
    }

    public CustomException (string message)
        : base(message)
    {
    }

    public CustomException (string message, Exception ex)
        : base(message, ex)
    {
    }

    #endregion

    #region Properties

    // Would like to use these properties in the Insert method
    public string ExceptionCode { get; set; }
    public string SourceType { get; set; }
    public string SourceDetail { get; set; }
    public string SystemErrorId { get; set; }

    #endregion        
}

1 个答案:

答案 0 :(得分:0)

将Server.GetLastError的结果强制转换为CustomException:

var ex = Server.GetLastError() as CustomException;

请记住,在某些情况下,您的CustomException可能不是StackTrace中的顶级异常,在这种情况下,您需要浏览InnerExceptions以找到正确的异常。

请查看@ scott-chamberlain关于如何设计自定义例外的链接。