C# 예외 전파란 무엇인가?
예외 전파(Exception Propagation)는 C#에서 예외 처리 메커니즘이 동작하는 방식을 통해 쉽게 이해할 수 있습니다.
try 블록 안에서 예외가 발생하면, 해당 try 블록에 연결된 catch 블록들이 차례대로 검사됩니다. 이는 발생한 예외를 처리할 수 있는 catch 블록이 존재하는지 확인하기 위함입니다. 만약 일치하는 catch 블록을 찾지 못하면, 예외는 상위(외부) try 블록으로 전파됩니다. 이 과정은 예외가 어딘가에서 처리될 때까지 계속 반복되며, 끝내 예외가 처리되지 않으면 프로그램의 실행이 종료됩니다.
아래 예제는 중첩된 try 문(nested try statement)을 사용하여 예외 전파의 개념을 보여줍니다.
예제
using System;
using System.Text;
public class Demo {
public static void Main() {
try {
try {
throw new ArgumentException();
} catch (NullReferenceException e) {
Console.WriteLine("catch one");
} finally {
Console.WriteLine("finally one");
}
} catch (Exception e) {
Console.WriteLine("catch two");
} finally {
Console.WriteLine("finally two");
}
Console.ReadLine();
}
}실행 결과
finally one catch two finally two
코드 분석
위 코드의 실행 흐름을 살펴보면 다음과 같습니다.
1. 내부 try 블록에서 ArgumentException이 발생합니다.
2. 내부 catch 블록은 NullReferenceException만 처리할 수 있으므로, 이 예외는 잡히지 않고 외부 try 블록으로 전파됩니다.
3. 예외가 전파되기 전에 내부 finally 블록이 먼저 실행되어 "finally one"이 출력됩니다.
4. 외부 catch 블록인 catch (Exception e)는 모든 예외의 기본 클래스인 Exception을 처리하므로, 전파된 예외를 성공적으로 잡아 "catch two"를 출력합니다.
5. 마지막으로 외부 finally 블록이 실행되어 "finally two"가 출력됩니다.
이처럼 C#에서는 가장 가까운 catch 블록부터 순서대로 예외 처리 여부를 검사하고, 적합한 처리자가 없으면 예외가 호출 스택을 따라 상위로 전파된다는 점을 기억하면 됩니다. 또한 finally 블록은 예외 발생 여부와 관계없이 항상 실행되므로, 리소스 해제 등의 정리 작업에 활용하는 것이 좋습니다.