[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
- 사용자 정의 예외 클래스
- System.SystemException
- System.Exception
다중 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#의 다양한 예외 처리 기능을 활용하여 더욱 안정적이고 견고한 프로그램을 작성해 보세요. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!
'Programming > C#' 카테고리의 다른 글
C# 가비지 콜렉터(Garbage Collector) 메모리 관리의 핵심 (1) | 2024.06.10 |
---|---|
C# 박싱(Boxing)과 언박싱(Unboxing) 값 형식과 참조 형식의 변환 (0) | 2024.06.10 |
C# LINQ 데이터 쿼리의 일관된 방식 (0) | 2024.06.09 |
C# 델리게이트(Delegate)의 다양한 사용법 (0) | 2024.06.09 |
C# 델리게이트(Delegate) 메서드 참조의 강력한 도구 (0) | 2024.06.09 |