연결 예외(Chained Exception)란?
연결 예외(Chained Exception)는 여러 개의 try-catch 문이 사슬처럼 이어져 예외를 순차적으로 처리하는 구조를 말합니다. 하위 메서드에서 발생한 예외를 상위 메서드로 전달할 때 새로운 예외로 감싸면, 원래 예외는 내부 예외(InnerException)로 보존됩니다. 이를 통해 예외가 어떤 호출 경로를 거쳐 전파되었는지 손쉽게 추적할 수 있습니다.
C#에서는 throw new Exception("메시지", 내부예외)처럼 생성자의 두 번째 인자에 기존 예외를 전달하여 연결 예외를 만듭니다.
연결 예외 만들기
1. 최상위 진입점(Main)에서 예외 받기
프로그램의 시작점인 Main() 메서드에서 첫 번째 try-catch 블록을 설정합니다.
static void Main(string[] args) {
try {
One();
} catch (Exception e) {
Console.WriteLine(e);
}
}
2. One() 메서드 – 예외를 감싸서 다시 던지기
One() 메서드 내부의 try-catch에서 발생한 예외를 잡아, 새로운 예외의 내부 예외로 전달합니다.
static void One() {
try {
Two();
} catch (Exception e) {
throw new Exception("First exception!", e);
}
}
3. Two() 메서드 – 연결 계속하기
Two() 메서드도 같은 방식으로 예외 체인을 이어갑니다.
static void Two() {
try {
Three();
} catch (Exception e) {
throw new Exception("Second exception!", e);
}
}
4. Three() 메서드 – 다음 단계로 전달
Three() 메서드 역시 동일한 패턴으로 예외를 감싸서 상위로 던집니다.
static void Three() {
try {
Last();
} catch (Exception e) {
throw new Exception("Third exception!", e);
}
}
5. Last() 메서드 – 예외 발생 지점
마지막 메서드에서 실제 예외가 처음 발생합니다.
static void Last() {
throw new Exception("Last exception!");
}
실행 결과
위 코드를 실행하면 예외가 다음과 같이 연결되어 출력됩니다.
System.Exception: First exception! ---< System.Exception: Second exception! ---< System.Exception: Third exception! ---< System.Exception: Last exception! at Demo.Three () [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0 --- End of inner exception stack trace --- at Demo.Two () [0x00016] in <199744cb72714131b4f5995ddd1a021f>:0 at Demo.One () [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0 --- End of inner exception stack trace --- at Demo.One () [0x00016] in <199744cb72714131b4f5995ddd1a021f>:0 at Demo.Main (System.String[] args) [0x00000] in <199744cb72714131b4f5995ddd1a021f>:0
출력 결과에서 ---< 기호는 내부 예외(InnerException)가 연결되어 있음을 나타냅니다. 가장 안쪽의 "Last exception!"이 최초 발생 원인이며, 바깥쪽으로 갈수록 각 단계에서 예외가 감싸진 것을 확인할 수 있습니다.
핵심 정리
- 연결 예외는 여러 try-catch 문을 체인처럼 연결해 예외를 단계별로 처리하는 기법입니다.
throw new Exception("메시지", 기존예외)형태로 기존 예외를 내부 예외로 전달합니다.- 스택 트레이스와 InnerException 정보를 통해 예외의 근본 원인과 전파 경로를 쉽게 파악할 수 있습니다.
- 디버깅과 로깅 시 원인 추적에 매우 유용하므로, 예외를 재던질 때는 반드시 원본 예외를 함께 전달하는 것이 좋습니다.