2011-10-24 2 views
2

전 Try-Catch 블록을 사용하는 곳에서 MVC 응용 프로그램을 사용하고 있으며 전역 부울 필드를 기반으로 활동/오류 로깅을 구현하는 쉬운 방법을 찾고 있습니다. 누구든지 내 자신의 활동을 추가하려면 Try-Catch 코드의 기능을 '확장'할 수있는 방법을 알고 있습니까/오류를 로깅하고 모든 블록을 터치하지 않고 로깅?Try Catch 기능 확장 C#

나는 자동으로 등등 ... 그리고 캐치 자동으로 URL, 액션, IDS, 매개 변수, IP 정보 등 내 DB에 특정 항목을 기록 할 수있는 시도 싶습니다 예를 들어

DB의 다른 테이블에 예외를 기록하십시오.

생각하십니까? 추천?

덕분에, 피터

+4

당신이 자동적 * 의미 할 수 있습니다 생각 사용할 수 있습니다. –

답변

4

사용자 지정 작업 필터를 만들고 그것으로 컨트롤러 나 액션 메소드를 장식합니다.

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); 
    } 
} 

http://msdn.microsoft.com/en-us/library/dd381609.aspx

는 그런 *은

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()); } Works great! 다시 한 번 감사드립니다. –

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

이 작업을 수행하는 가장 좋은 방법은 전역 처리기 메서드를 통해 모든 단일 오류를 처리하는 것입니다. 처리되지 않은 오류에 대해서만 호출되지만 catch 블록에서는 호출되기 때문에 application_error 처리기가 신경 쓰지 않아도됩니다. 이렇게하면 모든 catch 블록을 만져야 할 필요가 있지만 한 번만 수행하면됩니다. 그런 다음에는 한 곳에서 설명하는 것과 같은 전역 기능을 추가 할 수 있습니다.

내가 생각하는 방식은 Single Responsibility Principle을 생각하는 것입니다. 에러를 처리하는 것과 같은 것들은 에러가 잡힌 클래스가 아닌 다른 곳에서 처리되어야합니다 (대부분).

+1

감사합니다. 내가 능력을 가지고 있다면, 이것도 투표 할 수있을 것입니다. –

0

Microsoft 엔터프라이즈 라이브러리에는 다른 수준에서 예외를 관리하는 데 도움이되는 "블록"(모듈)이 있습니다. 그것은 당신의 요구를 충족하는 것처럼 당신은 그들이 아이디어를 무엇을 살펴보고, 심지어 보이는 경우를 사용할 수 있습니다

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

+0

감사합니다. 내가 할 수 있다면 또 하나의 표를 던지십시오. –