2011-10-18 2 views
0

이 접근 방법은 예외가 전파되지 않도록하기 때문에 안전하다고 생각했습니다. 내 동료는 예외가 주 스레드에서 관찰되어야 할 수도 있으므로 주 스레드까지 전달해야한다고 제안했습니다. 그 대답인가? 이것을 통해 누수가 누출 될 수있는 것을 볼 수 있습니까?예외가이 작업을 어떻게 넘어 설 수 있습니까?

private static void InvokeProcessHandlers<T>(List<T> processHandlers, Action<T> action) 
    {    
     // Loop through process handlers asynchronously, giving them each their own chance to do their thing. 
     Task.Factory.StartNew(() => 
     { 
      foreach (T handler in processHandlers) 
      { 
       try 
       { 
        action.Invoke(handler); 
       } 
       catch (Exception ex) 
       { 
        try 
        { 
         EventLog.WriteEntry(ResourceCommon.LogSource, 
              String.Format(CultureInfo.CurrentCulture, "An error occurred in a pre- or post-process interception handler: {0}", ex.ToString()), 
              EventLogEntryType.Error); 
        } 
        catch (Exception) 
        { 
         // Eat it. Nothing else we can do. Something is seriously broken. 
        } 

        continue; // Don't let one handler failure stop the rest from processing. 
       } 
      } 
     }); 
    } 

그런데 스택 추적은 실제로이 메서드에서 예외가 누수되었음을 나타냅니다.

예외는 AccessViolation이며, 나는이 방법을 호출하는 코드와 함께 할 가지고 있다고 생각합니다 :

_interceptionPreprocessHandlers = ReflectionUtility.GetObjectsForAnInterface<IInterceptionPreprocessHandler>(Assembly.GetExecutingAssembly()); 
+0

최소한 로그 할 수 있습니다! – Joe

+0

foreach 열거 자 자체에서 예외가 throw되지 않는 한 당신이 훌륭하다고 생각합니다. 즉,이 모든 예외를 실제로 사용 하시겠습니까? –

답변

1

그냥 확인해야합니다 :

InvokeProcessHandlers<IInterceptionPostProcessHandler>(InterceptionPostProcessHandlers, handler => handler.Process(methodCallMessage, methodReturnMessage)); 

InterceptionPostProcessHandlers에 대한 게터이 포함을 당신이 반복하기 전에 널 참조를위한 매개 변수

로그 쓰기가 exec 당신이 그것을 처리하는 경우는 false 반환하고 캐치로 시도 할

bool Logger.TryLog(params); 

이 메소드 내부 :의 ution,하지만 난 같은 첨부 :로 로깅을 캡슐화하여보다 깨끗하고 유지 보수하기 위해 추천 클라이언트 코드가 그것을 당신은 결코 마음을 해달라고하면 그냥 깨끗한 캡슐화 방법

+0

아직 확인하지는 못했지만 문제는이 메서드를 호출하는 코드와 관련이 있다고 생각합니다. 나는 그것을 보여주기 위해 위의 포스트를 편집했다. 처리기를 가져 와서 null을 반복하거나 처리기를 가져 오는 과정에서 예외를 발생시키는 데 문제가 될 수 있습니다. 감사! –

1
에서 로거를 호출

내 동료는 예외가 주 스레드에서 관찰 을해야 할 수도 있습니다, 따라서 최대 전달해야한다고 제안 메인 스레드로

어떻게 "메인 스레드로 넘어갈 수 있습니까?" 메인 스레드가 떨어져 자신의 일을하고있다.

당신이 할 수있는 최선의 방법은 구성 가능하고 호출 된 ExceptionHandler 델리게이트를 허용하는 것입니다.

관련 문제