[C#] | Exception has been thrown by the target of an invocation. 은 대체 뭐고 어떻게 해결하는걸까

2025. 2. 11. 03:05·개발/C#

개요

아.

 

이전에 FSM을 짜면서 한번 고생했던 기억이 있는 버그인데 또 만났습니다.

 

 


 

 

왜 뜨는거임?

일단 이 예외는 Reflection을 사용할때 납니다.

 

Reflection으로 접근중인 클래스, 메서드, 필드, 프로퍼티에서 예외가 Throw될 경우

'난 일단 뭔 Exception인지 모르겠는데 아무튼 저기서 예외라는데?'

라는 무책임한 마인드로 던져집니다.

 

정확히는 MethodInfo.Invoke()나 PropertyInfo.SetValue() 같은 Reflection을 통한 호출 과정에서 내부 메서드가 예외를 Throw 할 경우에 발생합니다.

저같은 경우 Activator를 통한 클래스 생성 도중에 생성자에서 NullReference를 뱉으면서 받았습니다.

 

이걸 처음 만나면 일단 원인을 알 수가 없기 때문에 추정되는 곳을 전부 뒤져봐야합니다.

 

 


 

 

해결

하수 : 일일히 함수 타고타고 들어가면서 오류 원인으로 추정되는거 하나씩 고쳐봄

중수 : InnerException으로 오류 원인 확인함

고수 : 유니티 끄고 잠

 

일반 예외를 고치는 것 처럼 찾아서 고치긴 어렵습니다.

당장 던져지는 예외는 책임감 없는 컴파일러가 '아무튼 예외가 있었음' 하고 던졌기 때문이에요.

예외를 던지기보단 공손하게 갖다주면 좋을텐데요.

 

아무튼 이 예외는 직접 잡아서 내부를 뜯어야 합니다.

말 그대로에요.

try catch를 통해서 오류가 발생하는 곳에서 예외를 잡아채야합니다.

public void Main()
{
	try
    {
    	Type type = typeof(MyClass);
        MyClass myClass = Activator.CreateInstance(type); //바로 예외 강속구
    }
    catch(Exception ex)
    {
    	Console.WriteLine($"Exception Checked : {ex.Messsage}");
    }
}

public class MyClass
{
	public MyClass()
    {
    	throw new NullReferenceException("널레퍼");
   	}
}

 

하지만 이래봤자 우리에게 돌아오는건 이런 메시지입니다.

Exception Checked : Exception has been thrown by the target of an invocation.

 

대체 무슨 예외인지 알수가 없죠.

 

그래서 C#은 InnerException이란걸 만들어뒀어요. 굳이 이래야 했을까 싶지만 저보다 코딩 500만배는 잘하는 사람들이고 Reflection의 메서드 호출에서 발생하는 오류들에 대한 판별도 필요하긴 할테니 어쩔 수 없겠다 싶었어요.

public void Main()
{
	try
    {
    	Type type = typeof(MyClass);
        MyClass myClass = Activator.CreateInstance(type); //바로 예외 강속구
    }
    catch(Exception ex)
	{
		Console.Write("예외래요 ㅋ : ");
		if(ex is TargetInvocationException)
    		Console.WriteLine(ex.InnerException.Message);
    	else
    		Console.WriteLine(ex.Message);
	}
}

public class MyClass
{
	public MyClass()
    {
    	throw new NullReferenceException("널레퍼런스익셉션;;");
   	}
}

 

예외안에 진짜 예외를 찾아서 Message를 받으면 이제 대체 무슨 오류가 뜨는지 알 수 있습니다.

Exception Chekced : 널레퍼

 

오류가 나는 곳을 정확히 알기 위해선 StackTrace라는걸 출력해볼 수도 있습니다. 

 

 


 

 

마치는 말

블로그 글이 잘 적히는 철이 있나봅니다. 적힐때 잘 적어줘야죠.

졸작 팀원이 만들어준 짤

 

'개발 > C#' 카테고리의 다른 글

[.NET Core] | #0 : 세상에서 가장 쉬운 서버 만들기  (3) 2025.07.01
[C#] | 확장 메서드 쓰고 싶다~.  (0) 2025.02.09
[C#] | 대체 is not은 뭔데  (2) 2024.09.26
[C#] | Type 비교에서의 'is' 와 'GetType()'  (1) 2024.08.03
'개발/C#' 카테고리의 다른 글
  • [.NET Core] | #0 : 세상에서 가장 쉬운 서버 만들기
  • [C#] | 확장 메서드 쓰고 싶다~.
  • [C#] | 대체 is not은 뭔데
  • [C#] | Type 비교에서의 'is' 와 'GetType()'
SundG0162
SundG0162
블로그 프로필은 머핀입니다.
  • SundG0162
    게임개발고수가될거야
    SundG0162
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 주저리 (2)
        • 잡담 (1)
        • 장현우 (0)
        • 회고록 (1)
      • 개발 (17)
        • C# (5)
        • CITADEL : 성채 (0)
        • HEXABEAT (0)
        • FRACTiLE (0)
        • UNNAMED (0)
        • Default Defense (9)
        • T-Engine (0)
        • Project EW (0)
        • VIRTUS (0)
        • Unity (2)
        • C++ (1)
        • WinAPI (0)
        • 그 외 (0)
      • 알고리즘 (8)
        • C# (0)
        • C++ (8)
      • 자료구조 (0)
        • C++ (0)
        • C# (0)
        • 공용 (0)
      • 기타 (6)
        • 아트 (4)
        • AI (1)
        • 수학 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    AI
    티스토리챌린지
    LLM
    오블완
    생성형ai
    코딩트리조별과제
    C#
    코딩
    코드트리
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
SundG0162
[C#] | Exception has been thrown by the target of an invocation. 은 대체 뭐고 어떻게 해결하는걸까
상단으로

티스토리툴바