Namespaces
Variants

try block

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

예외 try 블록에서 발생하면, 연결된 핸들러에 의해 처리될 수 있습니다.

목차

구문

try 복합문 처리기-시퀀스 (1)
try 생성자-초기화자  (선택적) 복합문 처리기-시퀀스 (2)
1) 일반적인 try 블록 .
2) A function try block . compound-statement 는 함수 본문의 복합문 구성 요소여야 합니다.
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: ;

키워드

try

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 98 C++98 switch 문이 제어를
compound-statement 안으로 전달할 수 있음
try 블록의
금지됨
CWG 1167 C++98 소멸자에 대한 함수 try 블록이 기본 클래스나 멤버
소멸자의 예외를 잡을지 여부가 명시되지 않음
해당 예외들은
잡힘

참고 항목