본문 바로가기
프로그래밍/C#

C# try-catch로 예외 상황을 컨트롤 해보자

by bantomak 2025. 5. 14.
반응형

try-catch란

try-catch는 코드 실행 중 예기지 못한 오류(예외)가 발생했을 때, 프로그램이 강제 종료되지 않도록 오류를 잡아서 처리하는 구조를 말한다.

try
{
    // 예외가 발생할 수 있는 코드
}
catch (Exception ex)
{
    // 예외가 발생했을 때 수행할 코드
}
finally
{
    // 예외가 발생하건 아니건 항상 수행되는 코드
}
  • try : 위험한 코드를 실행
  • catch : 예외를 감지하고 처리 (로깅, 사용자 응답, 재시도 등)
  • finally : 예외 여부와 관계없이 자원 정리 (Close, Dispose 등)

catch가 꼭 필요한가?

  • 예외를 무시하고 싶을 때 > 필요 없음
  • 예외 상황을 알고 반응해야 할 때 > 필수 (catch가 없으면 로그도 남기지 못함)
  • 하위 메서드가 예외를 다시 throw하지 않을 때 > 필요 없음
  • 예외 전파를 막고 응답을 제어하고 싶다면 > 필수

정리와 예외 반응을 명확하게 분리

try
{
    await handler.RunAsync(); // 실패 가능
}
catch
{
    // 예외 대응: 로깅, 리포트, 알림 등
}
finally
{
    // 자원 정리: Dispose, Remove, Close
}

try-catch 흐름 파악을 위한 예제 코드

static void Main(string[] args)
{
    try
    {
        try
        {
            var value = 1;
            int temp = value / 0;

            // Exception 발생시 바로 catch로 이동 이후 코드 실행 안됨
            Console.WriteLine(temp);
        }
        catch (DivideByZeroException dex)
        {
            // 특정 Exception을 캐치해서 핸들링이 가능 여기에 잡히면 아래에서는 안잡힘
            Console.WriteLine($"1. {dex.Message}");
        }
        catch (Exception e)
        {
            // 그외의 모든 에러들을 핸들링
            Console.WriteLine($"2. {e.Message}");
        }
    }
    catch (Exception ex)
    {
        // 내부에서 throw; 하지 않으면 여기서 잡히지 않는다.
        Console.WriteLine($"3. {ex.Message}");
    }
    finally
    {
        try
        {
            var value = 1;
            int temp = value / 0;
            Console.WriteLine(temp);
        }
        catch (Exception e)
        {
            // 특정 exception을 캐치하는게 아니라면 여기서 잡힌다.
            Console.WriteLine($"4. {e.Message}");
        }
        finally
        {
            Console.WriteLine("5. finally");
        }

        Console.WriteLine("6. finally");
    }
}

내부에서 잡힌 Exception을 throw; 하지 않았기 때문에 3번 로그가 남지 않는다.

throw를 사용해서 상위로 Exception을 전달하는 예제

static void Main(string[] args)
{
    try
    {
        try
        {
            var value = 1;
            int temp = value / 0;

            // Exception 발생시 바로 catch로 이동 이후 코드 실행 안됨
            Console.WriteLine(temp);
        }
        catch (DivideByZeroException dex)
        {
            // 특정 Exception을 캐치해서 핸들링이 가능 여기에 잡히면 아래에서는 안잡힘
            Console.WriteLine($"1. {dex.Message}");
            throw;
        }
        catch (Exception e)
        {
            // 그외의 모든 에러들을 핸들링
            Console.WriteLine($"2. {e.Message}");
            throw;
        }
    }
    catch (Exception ex)
    {
        // 내부에서 throw; 하지 않으면 여기서 잡히지 않는다.
        Console.WriteLine($"3. {ex.Message}");
    }
    finally
    {
        try
        {
            var value = 1;
            int temp = value / 0;
            Console.WriteLine(temp);
        }
        catch (Exception e)
        {
            // 특정 exception을 캐치하는게 아니라면 여기서 잡힌다.
            Console.WriteLine($"4. {e.Message}");
        }
        finally
        {
            Console.WriteLine("5. finally");
        }

        Console.WriteLine("6. finally");
    }
}

댓글