名稱空間
變體
操作

try

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 
異常
try
丟擲異常
處理異常
異常規範
    noexcept 規範 (C++11)
    動態規範 (直到 C++17*)
noexcept 運算子 (C++11)
 

try 塊中丟擲的異常可能會由關聯的處理程式處理。

目錄

[編輯] 語法

try 複合語句 處理程式序列 (1)
try ctor-initializer (可選) 複合語句 處理程式序列 (2)
1) 一個普通 try
2) 一個函式 try複合語句必須是函式體的複合語句部分。
複合語句 - 一個複合語句
處理程式序列 - 一個非空的處理程式序列
ctor-initializer - 成員初始化列表(僅適用於建構函式

[編輯] 普通 try

普通 try 塊是一個語句

如果異常從其複合語句中丟擲,則該異常將與其處理程式序列中的處理程式匹配。

void f()
{
    throw 1;     // NOT handled by the handler below
    try
    {
        throw 2; // handled by the associated handler
    }
    catch (...)
    {
        // handles the exception 2
    }
    throw 3;     // NOT handled by the handler above
}

[編輯] 函式 try

函式 try 塊是一種特殊的函式體

如果異常從其複合語句ctor-initializer(如果有)中丟擲,則該異常將與其處理程式序列中的處理程式匹配。

int f(bool cond)
{
    if (cond)
        throw 1;
    return 0;
}
 
struct X
{
    int mem;
 
    X() try : mem(f(true)) {}
    catch (...)
    {
        // handles the exception 1
    }
 
    X(int) try
    {
        throw 2;
    }
    catch (...)
    {
        // handles the exception 2
    }
};

在具有靜態儲存期的物件的解構函式中,或在與具有靜態儲存期的非塊變數關聯的物件的建構函式中丟擲的異常,不會被 main 函式上的函式 try 塊捕獲。

在具有執行緒儲存期 的物件的解構函式中,或在與具有執行緒儲存期的非塊變數關聯的物件的建構函式中丟擲的異常,不會被執行緒的初始函式上的函式 try 塊捕獲。

(C++11 起)

流出函式 try 塊的處理程式複合語句末尾,等同於流出該函式 try 塊的複合-語句末尾,除非該函式是建構函式或解構函式(見下文)。

[編輯] 建構函式和解構函式 try

對於類 C,如果其建構函式或解構函式定義的函式體是函式 try 塊,並且在 C 的子物件的初始化或析構期間分別丟擲異常,則該異常也將與函式 try 塊的處理程式序列中的處理程式匹配。

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 (...)
    {
        // handles the exception 1
    }
 
    ~Y() try {}
    catch (...)
    {
        // handles the exception 2
    }
};

在建構函式或解構函式的函式 try 塊的處理程式中,引用物件的任何非靜態成員或基類會導致未定義行為。

如果return 語句出現在建構函式的函式 try 塊的處理程式中,則程式格式錯誤。

如果控制到達建構函式或解構函式的函式 try 塊的處理程式末尾,則當前處理的異常將被重新丟擲。

[編輯] 控制流

try 塊的複合語句控制流受限語句

void f()
{
    goto label;     // error
    try
    {
        goto label; // OK
        label: ;
    }
    catch (...)
    {
        goto label; // error
    }
}

跳轉語句gotobreakreturncontinue)可用於將控制流轉移出 try 塊(包括其處理程式)。發生這種情況時,在 try 塊中宣告的每個變數都將在直接包含其宣告的上下文中銷燬。

try
{
    T1 t1;
    try
    {
        T2 t2;
        goto label; // destroy t2 first, then t1
    }
    catch(...)
    {
        // executed if an exception is thrown while destroying t2
    }
}
catch(...)
{
    // executed if an exception is thrown while destroying t1
}
label: ;

[編輯] 關鍵詞

try

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
CWG 98 C++98 一個 switch 語句可以轉移控制
進入 try 塊的複合語句
已禁止
CWG 1167 C++98 未指明解構函式上的函式 try 塊是否
捕獲來自基類或成員解構函式的異常
此類異常
被捕獲

[編輯] 參閱