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();
}
}
}
실행 결과
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ErrorHandlingApplication.DivNumbers.division (System.Int32 num1, System.Int32 num2) [0x00000] in :0 Result: 0
위 예제에서는 0으로 나누기를 시도했기 때문에 DivideByZeroException이 발생합니다. catch 블록이 이 예외를 처리한 뒤, finally 블록이 실행되어 결과값을 출력하는 것을 확인할 수 있습니다.
try-catch-finally 흐름 제어 규칙
C#에서 try-catch-finally를 사용한 예외 처리의 흐름 제어는 다음과 같이 정리할 수 있습니다.
- 예외가 발생한 경우: try 블록 실행 중 예외가 발생하면 즉시 제어가 catch 블록으로 넘어갑니다.
- catch 블록 종료 후: catch 블록의 실행이 모두 끝나면 finally 블록이 실행됩니다.
- 예외가 발생하지 않은 경우: try 블록이 끝까지 실행된 후 곧바로 finally 블록으로 제어가 이동합니다.
finally 블록의 특징
finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다. 이러한 특성 덕분에 파일 닫기, 데이터베이스 연결 해제처럼 반드시 수행해야 하는 리소스 정리 코드를 작성하기에 가장 적합한 위치입니다. 또한 try 블록 내에 return 문이 있더라도 finally 블록은 메서드 종료 전에 실행되므로, 예외 처리 로직을 설계할 때 이 점을 반드시 기억해야 합니다.