簡體   English   中英

非構造函數上的函數try塊是否有任何缺點?

[英]Do function try blocks on non-contructor functions have any disadvantage?

函數try塊是函數體的一種特殊形式,例如:

int f() try {
  // function body
} 
catch {
  // one or more catch-clauses.
}

主要目的是在構造函數中使用,以便記錄任何基類的構造函數拋出的異常。 但是,也可以在常規函數中使用它們。

對此存在一些(相當古老的)問題,詢問為什么我們對於常規函數(例如, 函數try塊)需要它,但在構造函數中卻沒有 但是,我的問題更多地指向另一個方向:我可以在常規函數中使用它代替常規try-block而不用擔心嗎? 假設是出於審美原因?

我為C ++庫開發了C接口,並且需要用try塊封裝每個接口功能,以捕獲任何異常。 因此,我想避免在每個函數中使用額外的花括號。

有一件事引起了我的擔憂:在答案https://stackoverflow.com/a/11535436/6695750中 ,davka引用了2000年的一篇文章,聲稱您不能從與a對應的catch塊中返回值。功能試塊。 我使用gcc 5.4.0進行了測試,在那里我可以從catch塊中返回一個值而不會出現問題。 這是gcc的標准擴展,還是非標准的擴展?

int f() try {
  // function body
} 
catch (/*..*/){
  // one or more catch-clauses.
}

相當於

int f() {
    try {
      // function body
    } 
    catch (/*..*/){
      // one or more catch-clauses.
    }
}

用於常規功能。

由於catch塊會拋出異常(隱式或顯式),因此只有構造函數/析構函數具有特殊處理。

另請參閱文檔

我可以在常規功能中使用它代替常規try-block而不用擔心嗎?

在某些情況下,您不能使用function-try-block :您不能在catch子句中訪問任何局部變量。

void g() {
    int i = 2;
    try {
        throw 2.3;
    } catch (double d) {
        cout << i << endl;   // OK. you can access i
        cout << d << endl;
    }
}

void f() try {
    int i = 2;
    throw 2.3;
} catch (double d) {
    cout << i << endl;   // FAIL! i is out of scope, you CANNOT access it.
    cout << d << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM