foo::foo()
try
{
body:
//... do stuff that could possibly throw
}
catch(std::exception &e){
handler:
throw;
}
那段代碼有兩個相當不尋常的結構。第一個是你已經指出的,已經在mjk的答案中解釋過了:body
和handler
是標籤。標籤用於goto
s,而這又可用於流量控制(確定代碼應繼續執行的位置)。現在,應該很少使用goto
,因爲很少有情況下它們不能被其他流量控制(if
,for
,while
,do
...)替代,這會使其更易讀。由於goto
很少使用,標籤也很少使用。
第二個有趣的結構是功能級別try塊:
foo::foo()
try {
} catch (std::exception const &) {
}
注意,有try
美中不足的是沒有內構造體,但實際上外的{}
。這也是一種罕見的構造。它旨在支持在構造函數中初始化程序列表的評估期間捕獲異常(在上面的代碼中是隱式的)。如果類型有一個基類,或者構造函數可能拋出的成員,那麼構造函數的主體將永遠不會被評估,並且常規的try-catch將不會有用於處理該異常。函數級別的try塊也包含初始化器列表,並且會在評估不同子成員的構造函數時捕獲拋出的任何異常。這是一個很少使用的構造,因爲在catch
塊中你確實做得不多。已經或尚未構建的確切狀態是未知的,並且不能被驗證,所以唯一可能的用途是重新引發相同的異常或不同的異常。在一個更完整的例子中的語法是:
T::T()
try
: base1(args), base2(), member1(), member2() //...
{
// body
} catch (exception1 const& ex1) {
// ...
throw; // rethrow same exception
} catch (exception2 const& ex2) {
// ...
throw different_exception();
}
這是一個標籤,你可以'goto'。 –
@ 0x499602D2他在初始化器之前並沒有詢問冒號,他詢問'body:'和'handler:'。 – Barmar
@Barmar對,我的錯 – 0x499602D2