언어/C#

Exception has been thrown by the target of an invocation

에린_1 2024. 8. 16. 09:38
728x90

Exception has been thrown by the target of an invocation

  • .NET 응용 프로그램에서 리플렉션(Reflection)을 사용하여 메서드나 속성을 호출할 때 발생하는 예외이다.
  • 이 예외는 호출된 메서드나 속성에서 내부적으로 예외가 발생했을 때, 리플렉션이 이 예외를 포착하고, 이와 같은 일반적인 예외 메시지를 반환할 때 나타난다.

예외의 원인

  • 이 오류는 특정한 예외에 대한 직접적인 정보가 없기 때문에, 예외의 원인이 무엇인지 알기 위해서는 내부 예외(Inner Exception)를 확인해야 한다. 내부 예외에는 실제로 발생한 문제에 대한 구체적인 정보가 포함되어 있다.

일반적인 발생 시나리오

  1. 리플렉션을 통한 메서드 호출
    • 리플렉션을 사용하여 메서드를 호출할 때, 그 메서드 내부에서 발생한 예외가 리플렉션 API에 의해 캡처되어 “Exception has been thrown by the target of an invocation”이라는 메시지와 함께 반환된다.
    try
    {
        MethodInfo method = typeof(SomeClass).GetMethod("SomeMethod");
        method.Invoke(someInstance, null);
    }
    catch (TargetInvocationException ex)
    {
        Console.WriteLine(ex.InnerException?.Message); // 실제 예외 메시지
    }
    
    
  2. 잘못된 메서드 호출
    • 대상 메서드에 잘못된 매개변수를 전달하거나, 메서드가 존재하지 않거나, 접근 권한이 없을 때 발생할 수 있다.
  3. 타입 또는 메서드 미스매치
    • 리플렉션으로 호출하려는 메서드와 실제 인스턴스의 타입이 일치하지 않을 경우 발생할 수 있다.

문제 해결 방법

  1. 내부 예외 확인
    • 예외의 실제 원인을 알아내기 위해 ‘TargetInvocationException.InnerException’ 속성을 확인한다. 이 속성에는 원래 발생한 예외에 대한 구체적인 정보가 포함되어 있다.
    catch (TargetInvocationException ex)
    {
        Console.WriteLine("Inner Exception: " + ex.InnerException?.Message);
    }
    
  2. 리플렉션 코드 검토
    • 리플렉션을 통해 호출하는 메서드의 매개변수 타입, 접근 가능성 등을 다시 확인하여, 올바르게 호출되고 있는지 점검한다.
  3. 디버깅
    • 디버거를 사용하여 코드의 예외 발생 지점을 확인하고, 예외의 원인을 추적한다. 메서드 호출 이전과 이후의 상태를 면밀히 검토한다.
  4. 권한 문제 확인
    • 호출 대상 메서드에 접근 권한이 충분한지 확인한다. 접근 제한자(private, protected 등)가 문제가 될 수 있다.
728x90

'언어 > C#' 카테고리의 다른 글

CompareTo  (0) 2024.08.16
Protobuf  (0) 2024.08.14
MergeFrom  (0) 2024.08.12
JsonFormatter.ToDiagnosticString  (0) 2024.08.12
ProtoMsg.ProtocolMessageReflection.Descriptor.MessageTypes  (0) 2024.08.12