2016-08-24 85 views
2

功能的try塊是功能機構的一種特殊形式,例如:做函數try塊對非構造函數有什麼缺點?

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

的主要目的是爲在構造的使用中,爲了記錄由任何鹼類的構造函數拋出的異常。但是,它也允許在常規功能中使用它們。

在這方面存在一些(相當古老)的問題,問我們爲什麼需要它用於常規功能,例如, Function try blocks, but not in constructors。然而,我的問題在另一個方面稍微有些變化:我可以在常規函數中使用它作爲常規嘗試塊的替代嗎?假設,僅僅出於美學原因?

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

只是一件事,這引起了我的擔憂:在答案https://stackoverflow.com/a/11535436/6695750,davka引用了2000年的一篇文章,聲稱你可以' t從一個對應於功能嘗試塊的catch-block中返回一個值。我用gcc 5.4.0進行了測試,在那裏我可以從catch-block返回一個沒有問題的值。這是標準,還是gcc的非標準擴展?

+0

我沒有看到任何陷阱,除了構造函數/析構函數rethrows。 – Jarod42

+0

[你引用的第二個答案](http://stackoverflow.com/a/11535436/1023390)完全是錯誤的(並且在創建時已經如此)。 – Walter

+0

一個(小)陷阱是它是意想不到的。如果你保持代碼簡單(C層只是調用C++層並處理異常),那很好。如果你的代碼隨着時間的推移變得越來越複雜/複雜(如我的一些代碼所做的那樣:)),這可能會變成多年來的殘酷 - 那麼你最好使用異常處理函數並將C++代碼作爲訪問者傳遞/ lambda。 – utnapistim

回答

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

相當於

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

進行常規的功能。

只有構造函數/析構函數具有特殊待遇,因爲catch塊會拋出異常(隱式或顯式地)。

另請參閱the docu here

+1

這是有道理的。你能提供一個標準或在線文件的參考嗎? – Walter

2

我可以在常規函數中使用它作爲常規嘗試塊的替代嗎?

在不能使用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; 
} 
+0

是的,當然。在g()中,try-block不包含整個函數體,因此顯然它不等同於函數try塊。 – ralfg

相關問題