扩展Try Catch功能C#

时间:2011-10-24 17:34:20

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

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

例如:

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

思考?建议?

谢谢, 彼得

5 个答案:

答案 0 :(得分:4)

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

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() 
    {//...}
}

答案 1 :(得分:1)

执行此操作的最佳方法是通过全局处理程序方法汇集每个错误...而不是application_error处理程序提醒您,因为这仅针对未处理的错误调用,而是在catch块中调用。虽然这需要您触摸每个catch块,但您只需要执行一次,从那时起,您可以添加全局功能,例如您在一个地方描述的功能。

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

对于您所谈论的内容,记录是一个非常常被引用的跨领域问题,称为Aspect Oriented Programming。关于它有a lot of information,但请注意,它通常不适合.NET开发人员的胆小。包裹你的头是一种奇怪的事情(我不会假装我已经成功地做到了这一点)。

答案 4 :(得分:0)

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

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