개요
아.
이전에 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($"예외래요 ㅋ : {ex.Messsage}");
}
}
public class MyClass
{
public MyClass()
{
throw new NullReferenceException("예외 쳐먹어라");
}
}
하지만 이래봤자 우리에게 돌아오는건 이딴 메시지입니다.
예외래요 ㅋ : 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를 받으면 이제 대체 무슨 오류가 뜨는지 알 수 있습니다.
예외래요 ㅋ : 예외 쳐먹어라
아, 적어둔 Message를 안지웠군요.
이건 적어둔 Message를 지울경우 잘 보일테니 일단 넘어갑시다.
오류가 나는 곳을 정확히 알기 위해선 StackTrace라는걸 출력해볼 수도 있습니다.
마치는 말
블로그 글이 잘 적히는 철이 있나봅니다. 적힐때 잘 적어줘야죠.
'개발 > C#' 카테고리의 다른 글
[C#] | 확장 메서드 쓰고 싶다~. (0) | 2025.02.09 |
---|---|
[C#] | 대체 is not은 뭔데 (2) | 2024.09.26 |
[C#] | Type 비교에서의 'is' 와 'GetType()' (1) | 2024.08.03 |
[C#] | string과 StringBuilder (1) | 2024.04.19 |