2011-10-24 73 views
2

我有一個MVC應用程序,我在其中使用Try-Catch塊,我正在尋找一種基於全局布爾字段實現活動/錯誤記錄的簡單方法。有沒有人知道我可以'擴展'Try-Catch代碼的功能,以添加我自己的活動/錯誤日誌記錄,而無需通過並觸摸每個塊?擴展Try Catch功能C#

例如:

我想要的嘗試自動登錄某些項目,我的DB如URL,動作,IDS,參數,IP信息等,... 和卡自動將其記錄爲數據庫中另一個表的異常。

的思考?建議?

謝謝, 彼得

+4

我想你可能意味着*自動的*。 –

回答

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

這正是我所期待的。我認爲在Try-Catch中實施它是解決方案,但這正是我所需要的。謝謝!我也會爲此投票,但還沒有足夠的代表。 –

+0

在實際的實現中,我將代碼添加到Global.asax文件中,並在RegsiterGlobalFilters中調用它... public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LoggingFilterAttribute()); }非常棒!再次感謝 –

0

我知道沒有辦法擴展現有的try/catch塊。但是,您可以在Global.asax中爲所有未處理的異常實施全局事件處理程序。

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

除此之外,你可能需要添加您從所有的異常處理程序調用類。

Exception可能創建一個擴展方法,使您的全局方法可以很容易地調用,將有機會獲得所有異常的詳細信息。

+0

謝謝。另外如果我可以投票 –

0

記錄是一個非常常見的交叉引用問題,您所談論的內容稱爲Aspect Oriented Programming。有關於它的有a lot of information,但請注意,它通常不適合.NET開發人員的心。把你的頭圍繞起來是件奇怪的事情(我不會假裝我已經成功地做到了這一點)。

+0

謝謝。如果可以的話,再投票。 –

1

做到這一點,最好的辦法是通過一個全球性的處理方法......沒有Application_Error事件處理程序介意你漏斗每一個錯誤,因爲這是隻調用未處理的錯誤,但是在catch塊。儘管這將需要你接觸每個catch塊,你只需做一次,從這時起,你可以像你只有一個地方形容一個添加全局的功能。

我喜歡去想它的方式是通過思考Single Responsibility Principle。像處理錯誤這樣的事情應該被處理(大部分)在錯誤被捕獲的類以外的其他地方。

+1

謝謝。如果我有能力,也會投這個票。 –

0

我不一定會建議使用此,但微軟企業庫有一個「塊」(即模塊)在不同層次上管理異常的幫助。你可以看看他們的想法做什麼,或者即使它看起來像使用它會滿足您的需求:

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

+0

謝謝。如果可以的話,再投票。 –