從建構子中拋出例外:詳細討論
在C 處理物件初始化時,會出現在建構函式中使用異常的問題。為了徹底檢查此主題,我們將深入研究涉及使用互斥包裝類別的真實場景。
問題:
在為了嘗試圍繞POSIX 互斥體提供安全接口,程式設計師設計了以下內容class:
class Mutex { public: Mutex() { if (pthread_mutex_init(&mutex_, 0) != 0) { throw MutexInitException(); } } ... };
問題:
考慮到建構子拋出異常的影響,這種設計方法是否適合?
答:
答案是肯定的。從遇到失敗的建構函數拋出異常被認為是物件導向程式設計中的標準做法。根據“Exceptional C FAQs”,如果類別“在建構過程中無法進入有效狀態,則建構函數應拋出異常。”
在此上下文中使用異常可確保不會建立無效對象,從而緩解與依賴錯誤互斥體相關的風險。
替代方案方法:
另一種解決方案,不太受歡迎但仍然可行,是在Mutex 類別中創建一個init() 成員函數,然後該函數將執行必要的初始化。這種方法引入了一個警告,即每個使用互斥體的客戶端程式碼在使用該物件之前都必須明確地呼叫 init()。
從構造函數拋出異常的好處:
主要從構造函數拋出異常的優點是它通過防止在初始化期間創建無效對象來增強安全性。它也符合 RAII(資源取得即初始化)原則,支持者認為該原則與基於異常的程式設計非常一致。
結論:
雖然可能存在固執己見的爭論關於構造函數中異常的使用,專家們的共識很明確:在確保完整性和有效性的情況下,從建構函數中拋出異常是一種可以接受的方法初始化期間物件的。
以上是C 中的建構子應該拋出異常嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!