创建属性以检查异常

时间:2012-04-13 11:11:21

标签: c# asp.net-mvc-3

我正在创建一个属性,以便每当我的网站上发生异常时,我都会收到一封详细说明异常的电子邮件。我到目前为止,但是如果发生异常,我的属性代码似乎不会触发:

public class ReportingAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        // This will generate an email to me
        ErrorReporting.GenerateEmail(filterContext.Exception);
    }
}

然后在我的控制器上面我正在做:

[ReportingAttribute]
public class AccountController : Controller

另一种方法是将ErrorReporting.GenerateEmail(ex)放入我的捕获块中?必须有一个更简单的方法吗?这就是为什么我想创建属性来处理这个

3 个答案:

答案 0 :(得分:2)

为了记录所有未捕获的异常,您可以在Global.asax.cs文件中定义以下方法:

private void Application_Error(object sender, EventArgs e)
{
    try
    {
        //
        // Try to be as "defensive" as possible, to ensure gathering of max. amount of info.
        //

        HttpApplication app = (HttpApplication) sender;

        if(null != app.Context)
        {
            HttpContext context = app.Context;

            if(null != context.AllErrors)
            {
                foreach(Exception ex in context.AllErrors)
                {
                    // Log the **ex** or send it via mail.
                }
            }

            context.ClearError();
            context.Server.Transfer("~/YourErrorPage");
        }
    }
    catch
    {
        HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
}

答案 1 :(得分:1)

Attribute只是无法定义行为,但它用于对代码数据进行一些标记。您应该编写代码,

  • 得到例外
  • 检查引发异常的方法中的给定属性是否存在
  • 如果存在,请收集并发送您需要的数据。

答案 2 :(得分:0)

为什么不创建基本控制器:

public ApplicationBaseController : Controller
{
    public override void OnException(ExceptionContext context)
    {
        //Send your e-mail
    }
}

ApplicationBaseController

派生您的控制器
public HomeController : ApplicationBaseController
{
    //.....
}