'throw'로 예외처를 할 때 'throw'와 'throw ex'가 있습니다.
특수한 경우가 아니라면 'throw ex'를 쓸 일이 없으므로 크게 중요한 내용은 아니지만, 알아두면 좋지 않겠습니까?
ㅎㅎㅎ
이 두 개의 차이는 'try~catch'가 중첩 되었을 때
즉, 에러처리를 중첩했을때 표시되는 위치가 차이 납니다.
'throw'는 여러 개가 중첩되더라고 실제 에러 난 위치부터 표시되고
'throw ex'는 'throw ex'를 호출한 위치부터 표시가 됩니다.
다양한 테스트 코드가 인터넷에 많습니다.
제가 사용한 코드는 아래와 같습니다.
참고 : stackoberflow - Is there a difference between "throw" and "throw ex"? : Shaul Behr님 답변
/// <summary>
/// https://stackoverflow.com/a/776756/6725889
/// </summary>
internal class Program
{
static void Main(string[] args)
{
try
{
ThrowException1(); // line 7
}
catch (Exception x)
{
Console.WriteLine("Exception 1:");
Console.WriteLine(x.StackTrace);
}
try
{
ThrowException2(); // line 16
}
catch (Exception x)
{
Console.WriteLine("Exception 2:");
Console.WriteLine(x.StackTrace);
}
}
private static void ThrowException1()
{
try
{
DivByZero(); // line 29
}
catch
{
throw; //전달받은 예외가 그대로 전달되므로 라인표시 안됨
}
}
private static void ThrowException2()
{
try
{
DivByZero(); // line 40
}
catch (Exception ex)
{
throw ex; // line 44 : 예외가 새로 생성되므로 라인표시 됨
}
}
private static void DivByZero()
{
int x = 0;
int y = 1 / x; // line 51
}
}
테스트 코드를 실행시키면 아래와 같이 동작합니다.
두 개의 에러 표시 위치가 다른 걸 알 수 있습니다.
'throw ex'의 용도는
- 실제 에러 위치를 숨길 때
- 'Exception'을 커스텀 하기 위해
사용됩니다.
또 다른 점으로는 릴리즈 모드에서는 추적된 스택이 달라질 수 있는데
이때 표시위치 차이로 인한 가독성이 좀 차이가 납니다.
아래 스크린 샷은 테스트 코드를 릴리즈 모드에서 실행한 화면입니다.
'throw'는 에러가 난 함수를 가리키고 있는 반면에
'throw ex'는 'throw ex'가 생성된 위치를 가리키고 있습니다.
테스트 프로젝트 : github - dang-gun/DotNetSamples/ThrowTest
참고 :
C# Corner - Difference between "throw" and "throw ex" in C#
stackoberflow - Is there a difference between "throw" and "throw ex"?
빡세게 예외 처리를 하지 않다가.....
빡세게 예외처를 하게 되면 마주하는 문제입니다.
모르겠으면 그냥 'throw' 쓰면 됩니다 ㅎㅎㅎㅎ