try
block
예외 가 try 블록에서 발생하면, 연결된 핸들러에 의해 처리될 수 있습니다.
목차 |
구문
try
복합문
처리기-시퀀스
|
(1) | ||||||||
try
생성자-초기화자
(선택적)
복합문
처리기-시퀀스
|
(2) | ||||||||
| compound-statement | - | a 복합문(compound statement) |
| handler-seq | - | 비어 있지 않은 핸들러(handlers) 시퀀스 |
| ctor-initializer | - | 멤버 초기화 리스트 ( 생성자(constructors) 전용) |
일반 try 블록
일반적인 try 블록은 문장 입니다.
만약 예외가 compound-statement 에서 발생하면, 해당 예외는 handlers 와 handler-seq 에서 매칭됩니다:
void f() { throw 1; // 아래 핸들러에 의해 처리되지 않음 try { throw 2; // 연결된 핸들러에 의해 처리됨 } catch (...) { // 예외 2를 처리함 } throw 3; // 위 핸들러에 의해 처리되지 않음 }
함수 try 블록
함수 try 블록은 특별한 종류의 함수 본문 입니다.
만약 예외가 해당 compound-statement 또는 ctor-initializer (존재하는 경우)에서 발생하면, 해당 예외는 handlers 와 handler-seq 에서 매칭될 것입니다:
int f(bool cond) { if (cond) throw 1; return 0; } struct X { int mem; X() try : mem(f(true)) {} catch (...) { // 예외 1을 처리합니다 } X(int) try { throw 2; } catch (...) { // 예외 2를 처리합니다 } };
정적 저장 기간 을 가진 객체들의 소멸자에서 던져진 예외들 또는 정적 저장 기간을 가진 비블록 변수들 와 연관된 객체들의 생성자에서 던져진 예외들은 main 함수 의 함수 try 블록에 의해 잡히지 않습니다.
|
스레드 저장 기간을 가진 객체들의 소멸자에서 던져진 예외들, 또는 스레드 저장 기간을 가진 비블록 변수들과 연관된 객체들의 생성자에서 던져진 예외들은 스레드의 초기 함수에 있는 함수 try 블록에 의해 잡히지 않습니다. |
(since C++11) |
함수 try 블록의 핸들러 복합문 끝을 벗어나는 것은 해당 함수 compound - statement 끝을 벗어나는 것과 동등합니다. 단, 함수가 생성자나 소멸자인 경우는 예외입니다(아래 참조).
생성자와 소멸자 try 블록
클래스
C
의 생성자나 소멸자 정의의 함수 본문이 함수
try
블록인 경우, 그리고 각각
C
의 하위 객체 초기화나 소멸 과정에서 예외가 발생하면, 해당 예외는 함수
try
블록의
handler-seq
에 있는
핸들러
와도 매칭됩니다:
int f(bool cond = true) { if (cond) throw 1; return 0; } struct X { int mem = f(); ~X() { throw 2; } }; struct Y { X mem; Y() try {} catch (...) { // 예외 1을 처리합니다 } ~Y() try {} catch (...) { // 예외 2를 처리합니다 } };
객체의 생성자나 소멸자의 함수 try 블록 핸들러에서 해당 객체의 비정적 멤버나 기본 클래스를 참조하는 것은 정의되지 않은 동작을 초래합니다.
만약 return 문 가 생성자의 함수 try 블록 핸들러 내에 나타나는 경우, 프로그램은 형식이 잘못되었습니다.
생성자나 소멸자의 함수 try 블록 핸들러의 끝에 제어가 도달하면, 현재 처리 중인 예외 가 재발생됩니다.
제어 흐름
compound-statement 의 try 블록은 제어 흐름 제한 문장 입니다:
void f() { goto label; // 오류 try { goto label; // 허용 label: ; } catch (...) { goto label; // 오류 } }
점프 문
(
goto
,
break
,
return
,
continue
)를 사용하여
try
블록(그리고 해당 핸들러들) 밖으로 제어를 전달할 수 있습니다. 이 경우,
try
블록 내에서 선언된 각 변수는 선언을 직접 포함하는 컨텍스트에서 소멸됩니다:
try { T1 t1; try { T2 t2; goto label; // t2를 먼저 파괴한 다음 t1을 파괴 } catch(...) { // t2 파괴 중 예외가 발생하면 실행됨 } } catch(...) { // t1 파괴 중 예외가 발생하면 실행됨 } label: ;
키워드
결함 보고서
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 98 | C++98 |
switch
문이 제어를
compound-statement 안으로 전달할 수 있음 try 블록의 |
금지됨 |
| CWG 1167 | C++98 |
소멸자에 대한 함수
try
블록이 기본 클래스나 멤버
소멸자의 예외를 잡을지 여부가 명시되지 않음 |
해당 예외들은
잡힘 |