2014-03-13 46 views
0

我正在開發一個Web應用程序。應用程序應該在頁面上有一個按鈕,將用戶重定向回同一頁面。在每5(或大約)場合中,當你按下按鈕時,程序應該拋出一些異常並記錄下來。日誌記錄Visual Studio MVC5

它應該捕獲異常並做三件事:發送電子郵件,將錯誤寫入文件並將其寫入調試窗口。

我至今控制器:

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      try 
      { 
       RedirectToAction("Index"); 
      } 
      catch (ArgumentException e) 
      { 

      } 
      Random RandNumber = new Random(); 
      int rand = RandNumber.Next(1000); 
      if(rand % 5 == 0) 
      { 
       throw new System.ArgumentException("This is a random excpetion"); 
      } 
      return View(); 
     } 

    } 

的想法是有記錄器類聲明的類LogMedia的集合,並通過所有實例循環。

類記錄儀:

public class Logger 
    { 
     List<LogMedia> m_loggers = new List<LogMedia>(); 
     void LogException(Exception ex) 
     { 
      foreach(var i in m_loggers) 
      { 
       //Loop through all Log Media instances 
      } 
     } 

類LogMedia

class LogMedia 
    { 
     public virtual void LogMessage(string Message); //virtual function that doesen't do anything 

    } 
    class OutputWindowLogMedia:LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      System.Diagnostics.Debug.WriteLine(Message); 
     } 
    } 
    class TextFileLogMedia : LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      File.AppendAllText("c:\\Temp\\Log.txt", Message); 
     } 
    } 
    class EmailLogMedia : LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      //send email 
     } 

    } 
} 

我的問題,你有以下幾種:

請問我的控制器的工作,因爲它與現在站立我正在嘗試實施什麼?我特別懷疑我的嘗試抓住..

什麼是循環這三個實例的最佳方法?

我是否有適合日誌介質的類別降級,即是否應該爲每個實例創建新類(繼承LogMedia),然後重寫LogMedia中的虛函數。

回答

1

目前還不清楚您是否希望在此特定操作,控制器或整個應用上發生此行爲。也就是說,除非有一些特定的恢復代碼要嵌入到邏輯中,否則我不會用try-catch來污染我的操作代碼。

有兩種選擇MVC框架提供了處理錯誤:

首先,你可以在一個特定的控制器覆蓋onException的:

protected override void OnException(ExceptionContext filterContext) 
{ 
    // do your logging here 
    // set this flag if you want to stop the exception from bubbling 
    filterContext.ExceptionHandled = true; 
} 

其次,你可以創建一個錯誤處理過濾器:

public class MyExceptionFilterAttribute : 
    System.Web.Mvc.FilterAttribute, 
    System.Web.Mvc.IExceptionFilter 
{ 
    public void OnException(System.Web.Mvc.ExceptionContext filterContext) 
    { 
     // same error handling logic as the controller override 
    } 
} 

過濾器既可以添加到全局過濾器列表中,也可以應用於如下的操作方法:

[MyExceptionFilter] 
public ActionResult Index() 
{ 
} 

編輯:忘記提及你的記錄器結構。使用Logger循環LogMedia的多個實例的方法是使用一個通用接口(例如log4net appender)支持多種日誌記錄機制的一種很好的通用方法。也就是說,您是否考慮過使用現有的經過驗證的框架來滿足您的日誌需求?你會得到一個經過徹底測試的框架來運行,而且這項技能將會延續到未來的努力中。

編輯2:在您發表評論後,我仔細研究了您的代碼,而不是您的異常陷印方法。在您的索引操作中,您將重定向到沒有條件檢查的索引。這將最終成爲一個常量重定向循環(直到IIS阻止你)。由於這是一項任務,因此我不想放棄太多,但在服務器端需要一些邏輯來檢測按鈕單擊並重定向到您的索引。考慮另一個接受HttpPost的Index動作方法(你的當前動作將是HttpGet處理程序)。

+0

該應用程序應該只做一件事,所以基本上我只有一個控制器在整個應用程序。這是一個針對學校的項目,教師建議使用try和catch,並實現類似於我發佈的類結構。我不認爲我們會使用現有的框架,而是實施我們自己的 – user3265963

+0

請參閱edit2獲取更新的響應。 – maf748