C#에서 예외(Exception)란 프로그램 실행 중 발생하는 비정상적인 상황에 대한 대응을 의미합니다. 대표적인 예로 0으로 나누기를 시도하는 경우를 들 수 있습니다.
C#은 다음 세 가지 키워드를 사용해 예외 처리를 수행합니다.
C# 예외 처리의 3가지 핵심 키워드
1. try
try 블록은 특정 예외가 발생할 가능성이 있는 코드 영역을 지정합니다. try 블록 뒤에는 반드시 하나 이상의 catch 블록이 따라와야 합니다.
2. catch
catch 블록은 프로그램에서 문제를 처리하고자 하는 지점에 배치되는 예외 핸들러입니다. catch 키워드는 발생한 예외를 잡아내어 적절히 처리하는 역할을 담당합니다.
3. finally
finally 블록은 예외가 발생하든 발생하지 않든 상관없이 반드시 실행되어야 하는 코드를 작성할 때 사용합니다. 예를 들어 파일을 열었다면, 예외 발생 여부와 관계없이 해당 파일을 반드시 닫아야 하는 경우에 finally 블록이 유용합니다.
예제 코드로 살펴보기
다음 예제는 C#에서 try-catch-finally를 활용해 예외를 처리하는 방법을 보여줍니다.
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers() {
result = 0;
}
public void division(int num1, int num2) {
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
코드 동작 원리
위 코드의 흐름을 단계별로 분석하면 다음과 같습니다.
- try 블록:
num1 / num2연산을 시도하지만, num2가 0이므로DivideByZeroException이 발생합니다. - catch 블록: 발생한 예외를 잡아 콘솔에 예외 메시지를 출력합니다. 프로그램이 강제 종료되지 않고 정상적으로 계속 실행됩니다.
- finally 블록: 예외 발생 여부와 무관하게 항상 실행되어 현재까지의 result 값을 출력합니다. 이 경우 나눗셈이 실패했으므로 초기값인 0이 출력됩니다.
핵심 로직 부분만 따로 살펴보면 다음과 같습니다.
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
try-catch-finally 사용 시 주의사항
- catch 블록은 구체적인 예외 타입부터 순서대로 작성하는 것이 좋습니다. 가장 일반적인
Exception을 먼저 작성하면 뒤따르는 세부 예외 블록에 도달하지 않습니다. - finally 블록은 리소스 해제(파일 스트림 닫기, 데이터베이스 연결 종료 등)에 활용하면 안전성을 크게 높일 수 있습니다.
- C# 6.0 이상에서는
using문과when필터 조건을 활용해 더욱 간결하고 안전한 예외 처리를 구현할 수 있습니다.
try-catch-finally 패턴은 견고하고 안정적인 C# 애플리케이션을 개발하기 위한 필수 요소입니다. 예외 상황을 미리 대비하여 프로그램이 갑작스럽게 중단되는 것을 방지하세요.