프로그래밍/C#, .NET

[.NET] 'throw' 와 'throw ex'의 차이

당근천국 2022. 8. 17. 15:30

'throw'로 예외처를 할 때 'throw'와 'throw ex'가 있습니다.

특수한 경우가 아니라면 'throw ex'를 쓸 일이 없으므로 크게 중요한 내용은 아니지만, 알아두면 좋지 않겠습니까?

ㅎㅎㅎ

 

 

1. 'throw' 와 'throw ex'의 차이

이 두 개의 차이는 'try~catch'가 중첩 되었을 때 

즉, 에러처리를 중첩했을때 표시되는 위치가 차이 납니다.

 

'throw'는 여러 개가 중첩되더라고 실제 에러 난 위치부터 표시되고

'throw ex'는 'throw ex'를 호출한 위치부터 표시가 됩니다.

 

 

2. 테스트해 보기

다양한 테스트 코드가 인터넷에 많습니다.

제가 사용한 코드는 아래와 같습니다.

참고 : 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
    }
}

 

테스트 코드를 실행시키면 아래와 같이 동작합니다.

 

두 개의 에러 표시 위치가 다른 걸 알 수 있습니다.

 

 

3. 'throw ex'의 용도

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