C#의 finally 블록은 예외가 발생하든 발생하지 않든 상관없이 반드시 실행되어야 하는 코드 집합을 실행하기 위해 사용됩니다. 대표적인 예로 파일을 열었다면, 처리 도중 예외가 발생했는지 여부와 관계없이 파일을 반드시 닫아야 합니다.
이러한 오류 처리 블록은 try, catch, finally 세 가지 키워드를 사용해 구현합니다. try 블록에는 예외가 발생할 가능성이 있는 코드를, catch 블록에는 예외 발생 시 처리할 코드를 작성하고, finally 블록에는 어떤 경우에도 수행해야 할 마무리 작업(리소스 해제 등)을 작성합니다.
finally 블록이 유용한 이유
- 리소스 정리 보장: 파일 스트림, 데이터베이스 연결, 네트워크 소켓 등을 예외 발생 여부와 관계없이 확실하게 닫을 수 있습니다.
- 코드 중복 제거: try 블록과 각 catch 블록마다 정리 코드를 반복해서 작성할 필요가 없습니다.
- 예측 가능한 실행 흐름: try나 catch 블록 안에 return 문이 있어 메서드를 빠져나가는 경우에도 finally 블록은 실행됩니다.
예제 코드
다음 코드를 실행하여 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();
}
}
}실행 결과 분석
위 예제에서는 25를 0으로 나누려고 하므로 DivideByZeroException이 발생하고, catch 블록이 이 예외를 잡아 콘솔에 출력합니다. 그 후 finally 블록이 실행되어 현재까지의 결과값을 화면에 표시합니다.
Exception caught: System.DivideByZeroException: Attempted to divide by zero. ... Result: 0
나눗셈이 실패했기 때문에 result 변수는 생성자에서 초기화된 기본값 0을 그대로 유지하며, 이 값이 finally 블록에서 출력됩니다. 이처럼 finally 블록은 예외 처리 흐름과 무관하게 항상 마지막에 실행된다는 점이 핵심입니다. 파일 입출력이나 데이터베이스 작업처럼 리소스 해제가 중요한 코드에서 특히 유용하게 활용됩니다.