[英]What if RAII constructor throws?
假設我有一個用於fopen和fclose的RAII類,名為ManagedFile,由於某種原因,它失敗並且構造函數拋出異常。
ManagedFile mf("e.txt") //fails and throws
mf.F( //What would happen here?9
會不會創建MF嗎?
如果不行,如果以后再使用mf,假設訪問mf內的文件* F,會發生什么情況?
如果RAII類的構造函數失敗,會發生什么情況?
如果mf
的構建失敗,則將不認為mf
的生命周期已開始,將恢復mf
任何部分構建(通過調用已完成構建的基礎和成員的析構函數),並在下一行由於將控制權轉移到catch塊中(否則程序將終止),因此不會達到使用哪個mf
目的。
如果構造函數拋出異常(並且拋出的異常未在構造函數本身中捕獲),則對象的構造將失敗。
如果類具有類成員,則在構造函數執行之前將完全構建這些類成員,並且在引發異常繼續之前,引發的異常將銷毀它們。
同上任何超類。 然后,拋出的異常還將銷毀在開始構造子類並進入拋出異常的構造函數之前創建的所有超類。
最重要的是,對象會被精心解構,也就是說,無論對象的任何部分已經被構建,它們都會被解構。
最后,對象不可能在任何地方存在。 從邏輯上講,它不可能存在。
由於未捕獲到異常,因此必須傳播異常,並退出聲明對象的范圍。
即使您捕獲到異常:
try
{
ManagedFile mf ( /* construct arguments */ );
/* More code */
} catch (...)
{
/* More code */
}
這是最早可以捕獲異常的地方。 如果將它拋出在ManagedFile
的構造函數中,則可能無法在try
塊內繼續執行。 您必須捕獲異常,這是最快可以捕獲的異常。
並且此ManagedFile
對象僅存在於try
塊內部。 在try
塊之外,它不存在。 這包括catch
塊。 它也不存在。
因此,如果此構造方法引發異常,則從邏輯上講該對象將不存在。
PS如果在動態范圍內(使用new
)構造了對象,則在異常向上傳播之前,拋出的異常還將照顧釋放new
分配的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.