.NET에서 예외를 잘못 throw하면 스택 추적이 지워질 수 있습니다.

6596 단어 dotnetcsharp
잘못된 방법으로 예외를 포착하고 다시 throw하는 경우 스택 추적을 지우고 있을 수 있습니다. 예외가 원래 발생한 위치를 모르기 때문에 디버깅을 악몽으로 만들 수 있습니다.
다음과 같이 예외를 포착하고 다시 throw하는 경우 스택 추적의 일부를 지우는 것입니다.

try
{
    DoWork();
}
catch (Exception ex)
{
    throw ex;
}



다시 throw된 예외를 catch하고 스택 추적을 인쇄하면 예외가 원래 throw된 DoWork 메서드에 대한 언급이 없음을 알 수 있습니다.

System.Exception: Exception of type 'System.Exception' was thrown.
    at CatchRethrow.Program.IncorrectCatchAndReThrow() in /home/azureuser/CatchRethrow/Program.cs:line 50
    at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 22


예외가 다시 발생했을 때 덮어 쓰기 때문입니다.
올바른 구문은 throw; 대신 throw ex;를 사용하는 것입니다.

try
{
    DoWork();
}
catch (Exception ex)
{
    throw;
}


지금 다시 발생한 예외를 catch하고 스택 추적을 인쇄하면 DoWork 메서드가 스택 추적의 일부로 인쇄됩니다.

System.Exception: Exception of type 'System.Exception' was thrown.
    at CatchRethrow.Program.DoWork() in /home/azureuser/CatchRethrow/Program.cs:line 56
    at CatchRethrow.Program.CorrectCatchAndThrow() in /home/azureuser/CatchRethrow/Program.cs:line 34
    at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 12


운 좋게도 이에 대해 경고하는 코드 분석 규칙 "CA2200: Rethrow to preserve stack details "이 있습니다.
다음은 위의 문제를 설명하는 데 사용된 전체 코드 샘플입니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        // correct catch/throw
        try
        {
            CorrectCatchAndThrow();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            /*
            System.Exception: Exception of type 'System.Exception' was thrown.
                at CatchRethrow.Program.DoWork() in /home/azureuser/CatchRethrow/Program.cs:line 56
                at CatchRethrow.Program.CorrectCatchAndThrow() in /home/azureuser/CatchRethrow/Program.cs:line 34
                at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 12
            */
        }

        // incorrect catch/throw
        try
        {
            IncorrectCatchAndReThrow();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            /*
            System.Exception: Exception of type 'System.Exception' was thrown.
                at CatchRethrow.Program.IncorrectCatchAndReThrow() in /home/azureuser/CatchRethrow/Program.cs:line 50
                at CatchRethrow.Program.Main(String[] args) in /home/azureuser/CatchRethrow/Program.cs:line 22
            */
        }
    }

    static void CorrectCatchAndThrow()
    {
        try
        {
            DoWork();
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    static void IncorrectCatchAndReThrow()
    {
        try
        {
            DoWork();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    static void DoWork()
    {
        throw new Exception();
    }
}

좋은 웹페이지 즐겨찾기