'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' 쓰면 됩니다 ㅎㅎㅎㅎ