我有一个MVC应用程序,我在其中使用Try-Catch块,我正在寻找一种基于全局布尔字段实现活动/错误记录的简单方法。有没有人知道我可以'扩展'Try-Catch代码的功能,以便添加我自己的活动/错误记录,而不必经历并触摸每个块?
例如:
我想尝试自动将某些项目记录到我的数据库中,例如网址,操作,ID,参数,IP信息等,... 并且Catch自动将它的异常记录到DB中的另一个表中。
思考?建议?
谢谢, 彼得
答案 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