我有一個MVC應用程序,我在其中使用Try-Catch塊,我正在尋找一種基於全局布爾字段實現活動/錯誤記錄的簡單方法。有沒有人知道我可以'擴展'Try-Catch代碼的功能,以添加我自己的活動/錯誤日誌記錄,而無需通過並觸摸每個塊?擴展Try Catch功能C#
例如:
我想要的嘗試自動登錄某些項目,我的DB如URL,動作,IDS,參數,IP信息等,... 和卡自動將其記錄爲數據庫中另一個表的異常。
的思考?建議?
謝謝, 彼得
我有一個MVC應用程序,我在其中使用Try-Catch塊,我正在尋找一種基於全局布爾字段實現活動/錯誤記錄的簡單方法。有沒有人知道我可以'擴展'Try-Catch代碼的功能,以添加我自己的活動/錯誤日誌記錄,而無需通過並觸摸每個塊?擴展Try Catch功能C#
例如:
我想要的嘗試自動登錄某些項目,我的DB如URL,動作,IDS,參數,IP信息等,... 和卡自動將其記錄爲數據庫中另一個表的異常。
的思考?建議?
謝謝, 彼得
創建自定義操作過濾器和裝飾控制器或動作方法吧。
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()); }
非常棒!再次感謝 –
我知道沒有辦法擴展現有的try/catch塊。但是,您可以在Global.asax中爲所有未處理的異常實施全局事件處理程序。
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
}
除此之外,你可能需要添加您從所有的異常處理程序調用類。
上Exception
可能創建一個擴展方法,使您的全局方法可以很容易地調用,將有機會獲得所有異常的詳細信息。
謝謝。另外如果我可以投票 –
記錄是一個非常常見的交叉引用問題,您所談論的內容稱爲Aspect Oriented Programming。有關於它的有a lot of information,但請注意,它通常不適合.NET開發人員的心。把你的頭圍繞起來是件奇怪的事情(我不會假裝我已經成功地做到了這一點)。
謝謝。如果可以的話,再投票。 –
做到這一點,最好的辦法是通過一個全球性的處理方法......沒有Application_Error事件處理程序介意你漏斗每一個錯誤,因爲這是隻調用未處理的錯誤,但是在catch塊。儘管這將需要你接觸每個catch塊,你只需做一次,從這時起,你可以像你只有一個地方形容一個添加全局的功能。
我喜歡去想它的方式是通過思考Single Responsibility Principle。像處理錯誤這樣的事情應該被處理(大部分)在錯誤被捕獲的類以外的其他地方。
謝謝。如果我有能力,也會投這個票。 –
我不一定會建議使用此,但微軟企業庫有一個「塊」(即模塊)在不同層次上管理異常的幫助。你可以看看他們的想法做什麼,或者即使它看起來像使用它會滿足您的需求:
http://msdn.microsoft.com/en-us/library/ff664698(v=PandP.50).aspx
謝謝。如果可以的話,再投票。 –
我想你可能意味着*自動的*。 –