본문 바로가기
Programming/C#

C# 예외 처리 안전한 프로그램을 위한 필수 기술

by Dev_카페인 2024. 6. 10.
반응형

[C#] 예외 처리 : 안전한 프로그램을 위한 필수 기술

안녕하세요! 이번 포스트에서는 C#의 예외 처리(Exception Handling)에 대해 알아보겠습니다. 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 관리하고, 프로그램이 비정상적으로 종료되지 않도록 하는 중요한 기법입니다.

예외(Exception)란 무엇인가요?

예외(Exception)는 프로그램 실행 중에 발생하는 예기치 않은 상황이나 오류를 말합니다. 예외가 발생하면 프로그램의 정상적인 흐름이 중단될 수 있습니다. 예를 들어, 파일을 열 수 없거나, 배열의 인덱스가 범위를 벗어나는 경우 등이 예외 상황에 해당합니다.

예외 처리의 기본 구조

C#에서 예외 처리는 try, catch, finally 키워드를 사용하여 구현됩니다.

  • try 블록: 예외가 발생할 가능성이 있는 코드를 포함합니다.
  • catch 블록: 예외가 발생했을 때 실행할 코드를 포함합니다.
  • finally 블록: 예외 발생 여부와 상관없이 항상 실행할 코드를 포함합니다.

예제 1: 기본 예외 처리

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            Console.WriteLine(numbers[5]); // 예외 발생
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"예외 발생: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("프로그램 종료.");
        }
    }
}

위 예제에서 try 블록 내의 코드가 실행되다가 IndexOutOfRangeException이 발생하면, catch 블록이 실행되어 예외 메시지를 출력합니다. finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다.

예외 클래스 계층 구조

C#의 모든 예외는 System.Exception 클래스를 상속받습니다. 예외 클래스는 다음과 같은 계층 구조를 가집니다:

  • System.Object
    • System.Exception
      • System.SystemException
        • System.IndexOutOfRangeException
        • System.NullReferenceException
        • System.InvalidOperationException
        • ...
      • System.ApplicationException
        • 사용자 정의 예외 클래스

다중 catch 블록

하나의 try 블록에서 여러 종류의 예외를 처리할 수 있도록 다중 catch 블록을 사용할 수 있습니다.

예제 2: 다중 catch 블록

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            Console.WriteLine(numbers[5]); // IndexOutOfRangeException 발생
            int result = 10 / int.Parse("0"); // DivideByZeroException 발생 가능
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"인덱스 오류: {ex.Message}");
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine($"0으로 나눌 수 없습니다: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"일반 예외: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("프로그램 종료.");
        }
    }
}

위 예제에서 try 블록 내에서 발생할 수 있는 여러 종류의 예외를 각각의 catch 블록에서 처리합니다. Exception 클래스는 모든 예외의 기본 클래스이므로, 일반적인 예외 처리를 위해 마지막에 위치합니다.

사용자 정의 예외

C#에서는 System.Exception 클래스를 상속받아 사용자 정의 예외를 만들 수 있습니다.

예제 3: 사용자 정의 예외

using System;

public class CustomException : Exception
{
    public CustomException(string message) : base(message)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            throw new CustomException("사용자 정의 예외 발생");
        }
        catch (CustomException ex)
        {
            Console.WriteLine($"예외 발생: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("프로그램 종료.");
        }
    }
}

위 예제에서 CustomException 클래스는 Exception 클래스를 상속받아 사용자 정의 예외를 구현합니다.

예외 필터

C# 6.0부터는 catch 블록에 예외 필터를 사용할 수 있습니다. 예외 필터를 사용하면 특정 조건에 따라 예외를 처리할 수 있습니다.

예제 4: 예외 필터

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            int number = int.Parse("abc"); // FormatException 발생
        }
        catch (FormatException ex) when (ex.Message.Contains("Input string was not in a correct format"))
        {
            Console.WriteLine($"예외 필터 처리: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("프로그램 종료.");
        }
    }
}

위 예제에서 catch 블록에 예외 필터를 사용하여 특정 조건에 따라 예외를 처리합니다.

예외 처리의 베스트 프랙티스

  • 구체적인 예외 처리: 가능한 한 구체적인 예외를 처리하여 예외 상황에 맞는 대응을 할 수 있도록 합니다.
  • 최소한의 예외 처리: 필요한 부분에서만 예외 처리를 하여 코드의 가독성을 높이고, 과도한 예외 처리를 피합니다.
  • 로그 기록: 예외 발생 시 로그를 기록하여 디버깅 및 문제 해결에 도움을 줍니다.
  • 사용자 정의 예외: 필요에 따라 사용자 정의 예외를 만들어 사용하면 코드의 명확성을 높일 수 있습니다.

마치며

이번 포스트에서는 C#의 예외 처리에 대해 알아보았습니다. 예외 처리는 프로그램의 안정성을 높이고, 예기치 않은 상황에서도 프로그램이 비정상적으로 종료되지 않도록 하는 중요한 기법입니다. C#의 다양한 예외 처리 기능을 활용하여 더욱 안정적이고 견고한 프로그램을 작성해 보세요. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

반응형