![[C#] re-throw? 그리고 throw vs throw EX](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZlWrS%2FbtrMqtVtwOq%2FZY5N2OrWVK1Kxy8Z0RHJOK%2Fimg.png)
Rethrow?
try - catch 를 책으로 공부하고 이런저런 예제 코드들을 보면서 try절의 코드블록 안에서 throw new Exception 을 하는것이 아닌 , catch 안에서 throw를 하는 코드들을 봤었다.
try
{
//실행할 코드
}
catch
{
throw;
}
catch(Exception ex)
{
throw ex;
}
rethrow라는 문법은 따로 없지만 , 예외를 catch에서 잡아서 다시 던지는것을 rethrow라고 부르는것 같았다.
우리가 유니티에서 오류를 내서 그 오류를 눌러본다면, 아래의 사진처럼 친절하게도 어디서 부터 오류가 난건지 알려준다.
만약 오류를 낸 코드를 달랑 한줄만 알려준다면, 열결되어있는 수많은 코드들을 추적하기 어렵기때문에 이 오류의 근원지가 어디인지 찾아내기가 쉽지 않을것이다.
예외의 원인 추적, StackTrace
C# 예외 클래스들의 조상 Exception 클래스의 속성들을 살펴보면 StackTrace 라는 속성을 볼 수있는데, 이 속성으로 오류가 난 곳을 추적할수 있다.
Exception.StackTrace 속성 (System) | Microsoft Learn
Exception.StackTrace 속성 (System)
호출 스택의 직접 실행 프레임 문자열 표현을 가져옵니다.
learn.microsoft.com
static void Main(string[] args)
{
try
{
int zero = 0;
int a = 1 / zero;
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
1을 0으로 나누는 코드를 작성 후, catch에서 어디서 오류가 난건지 메세지를 찍게 코드를 작성 했다.
라인 14에서 오류가 났다고 친절하게 알려주는것을 확인 가능하다.
Throw VS Throw EX
Throw EX
이제 re-throw를 해보기 위해 메서드를 이용해서 코드를 작성했다.
1. 오류를 내는 메서드 (59번째 줄에서 오류가 난다)
private static void DivideByZero()
{
int zero = 0;
int a = 3 / zero; //Line 59
}
2.catch에서 Exception타입 ex를 받아 예외를 다시 던지는 메서드 (40번째 줄에서 예외를 다시 던진다)
public static void ThrowEX()
{
try
{
DivideByZero();
}
catch(Exception ex)
{
throw ex; //Line 40
}
}
3.메인 함수에서 호출
static void Main(string[] args)
{
try
{
ThrowEX(); //Line 12
}
catch(Exception ex)
{
Console.WriteLine("Throw EX");
Console.WriteLine(ex.StackTrace);
}
}
메인 함수에서 try 로 ThrowEX 함수를 호출, catch에서 ex의 오류 위치를 추적해 메세지를 찍게 만들었다.
오류의 근원지는 DivideByZero메서드에 있는 59번째 줄에 있는 코드인데,
ThrowEX 메서드를 호출한 12번 라인과, rethrow를 한 40번 라인이 찍히는 것을 볼 수 있다.
Throw
1. 위와 똑같이 오류를 내는 메서드 (59번째 줄에서 오류가 난다)
private static void DivideByZero()
{
int zero = 0;
int a = 3 / zero; //Line 59
}
2. 이번엔 Throw라는 메서드를 만들어서 catch에 Exception을 받지 않고 throw로만 코드를 작성했다.
public static void Throw()
{
try
{
DivideByZero(); //Line 48
}
catch
{
throw;
}
}
3. 메인함수에서 호출
static void Main(string[] args)
{
try
{
Throw(); //Line 23
}
catch (Exception ex)
{
Console.WriteLine("Throw");
Console.WriteLine(ex.StackTrace);
}
}
이번에는 DivideByZero메서드 안에 0으로 나눈 에러를 낸 가장 최초의 코드인 59번째 줄 코드,
DivideByZero메서드를 호출한Throw메서드 안의 48번째 줄 코드,
그리고 Throw 메서드를 호출한 메인 함수안의 23번째 줄 코드를 차례대로 메세지를 찍어내는것을 볼 수 있다.
처음에는 뭐가 다른건지 이해가 잘 안갔지만 아래의 사진을 보면 차이점을 알 수 있는데,
계속 throw로 던지면 그 stack들이 저장이 되지만,
catch에서 (Exception ex) 를 써서 ex를 다시 Throw 해버리면 throw ex를 한 그 코드가 오류의 근원지로 찍혀 나온다.
비주얼 스튜디오에서 throw ex로 코드를 작성해보면 친절하게도 스택 정보가 변경된다는 경고를 날려주는데,
그냥 throw 로 던진다면 어떠한 경고도 표시되지 않는다.
마소의 도큐먼트를 보면 throw e는 룰을 위반 , throw는 룰을 충족시켰다고 표현하고있다.
참고 사이트
CA2200: 스택 정보를 유지하도록 다시 throw하세요(코드 분석) - .NET | Microsoft Learn
CA2200: 스택 정보를 유지하도록 다시 throw하세요(코드 분석) - .NET
코드 분석 규칙(CA2200: 스택 정보를 유지하도록 다시 throw하세요)에 관한 자세한 정보
learn.microsoft.com
c# - Is there a difference between "throw" and "throw ex"? - Stack Overflow
Is there a difference between "throw" and "throw ex"?
There are some posts that asks what the difference between those two are already. (why do I have to even mention this...) But my question is different in a way that I am calling "throw ex" in anot...
stackoverflow.com
[C#] 예외를 처리하는 방법 (catch, Exception, rethrow) — 나는야 프로그래머 (tistory.com)
[C#] 예외를 처리하는 방법 (catch, Exception, rethrow)
1. try ~ catch using System; using System.Net; class Program { static void Main() { WebClient wc = new Webclient(); string s = wc.DownloadString("http://www.naver.com"); Console.WriteLine(s); } } 웹..
dhshin94.tistory.com
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[C#] 여러개의 Enum - [Flags] Attribute (0) | 2023.09.24 |
---|---|
델리게이트와 이벤트(Delegate & Event) (1) | 2023.03.21 |
[C#] 예외처리 Try - Catch / Throw & Finally (0) | 2022.09.18 |
[C#] 프로퍼티란? & 자동구현 프로퍼티와 public 변수와의 차이 찾아보기 (0) | 2022.08.24 |
[C#] 메소드 오버로딩,가변 개수의 인수, 명명된 인수, this() 생성자 (0) | 2022.08.24 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!