【问题标题】:Extend the Try Catch functionality C#扩展 Try Catch 功能 C#
【发布时间】:2011-12-14 08:01:30
【问题描述】:

我有一个 MVC 应用程序,我在其中始终使用 Try-Catch 块,我正在寻找一种基于全局布尔字段实现活动/错误日志记录的简单方法。有谁知道我可以“扩展” Try-Catch 代码的功能,以便添加我自己的活动/错误日志,而不必遍历每个块?

例如:

我想要尝试自动将某些项目记录到我的数据库中,例如 url、操作、ID、参数、IP 信息等... 并且 Catch 会自动将其异常记录到数据库中的另一个表中。

想法?推荐?

谢谢, 彼得

【问题讨论】:

  • 我想你的意思可能是自动

标签: c# asp.net-mvc logging try-catch


【解决方案1】:

创建您的自定义操作过滤器并用它装饰控制器或操作方法。

http://msdn.microsoft.com/en-us/library/dd381609.aspx

public class LoggingFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
            filterContext.ActionDescriptor.ActionName);

        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
            filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");

        base.OnActionExecuted(filterContext);
    }
}

那就用吧

public class HomeController : Controller
{
    [LoggingFilter]
    public ActionResult Index() 
    {//...}
}

【讨论】:

  • 这正是我想要的。我认为在 Try-Catch 中实现它是解决方案,但这正是我一直在寻找的。谢谢!我也会对此投赞成票,但还没有足够的代表。
  • 在实际实现时,我将代码添加到 Global.asax 文件中,并在 RegsiterGlobalFilters 中调用... public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LoggingFilterAttribute() ); } 效果很好!再次感谢
【解决方案2】:

做到这一点的最好方法是通过全局处理程序方法汇集每一个错误......而不是 application_error 处理程序,因为它只在未处理的错误中调用,但在 catch 块中。虽然这需要您触摸每个 catch 块,但您只需执行一次,然后您就可以添加全局功能,就像您在一个地方描述的那样。

我喜欢思考它的方式是思考Single Responsibility Principle。处理错误之类的事情应该(在大多数情况下)在捕获错误的类之外的其他地方处理。

【讨论】:

    【解决方案3】:

    我不知道如何扩展现有的 try/catch 块。但是,您可以在 Global.asax 中为所有未处理的异常实现全局事件处理程序。

    void Application_Error(object sender, EventArgs e) 
    {
        // Code that runs when an unhandled error occurs
    }
    

    除此之外,您可能需要添加一个从所有异常处理程序中调用的类。

    也许在Exception 上创建一个扩展方法,以便可以非常轻松地调用您的全局方法,并且可以访问所有异常详细信息。

    【讨论】:

      【解决方案4】:

      日志记录是您所说的一个非常常见的跨领域关注点,称为Aspect Oriented Programming。有关于它的a lot of information,但请注意,它通常不适合.NET 开发人员的胆小。把你的头绕起来是一件很奇怪的事情(我不会假装我已经成功地做到了)。

      【讨论】:

        【解决方案5】:

        我不一定建议使用它,但 Microsoft Enterprise Library 有一个“块”(即模块),可以帮助管理不同级别的异常。您可以看看他们为创意做了什么,或者如果它看起来可以满足您的需求,甚至可以使用它:

        http://msdn.microsoft.com/en-us/library/ff664698(v=PandP.50).aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          • 2011-12-15
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多