從建構子中拋出異常:設計注意事項
在軟體開發領域,關於從建構子中拋出異常是否合適的爭論一直存在。這個問題引發了程式設計愛好者的討論,最近一位同事的詢問促使我們深入研究這個主題。
從設計的角度來看,建構子拋出異常是否可以接受?
考慮一個類別封裝了POSIX 互斥體的場景,如範例所示下面:
class Mutex { public: Mutex() { if (pthread_mutex_init(&mutex_, 0) != 0) { throw MutexInitException(); } } };
在這種情況下,如果對pthread_mutex_init 的呼叫失敗,則互斥對象將變得不可用。拋出例外可確保物件不會在不一致的狀態下創建,從而防止潛在的錯誤。
標準實踐與成員函數方法
有人可能會爭論該類別可以有一個用於初始化的成員函數,該函數根據pthread_mutex_init 呼叫的結果傳回一個布林值,而不是拋出異常。這種方法有其優點,但也帶來了一個微妙的問題。它依賴於每個使用者記住呼叫初始化函數,這可能會被忽略並導致未定義的行為。這種與 RAII 原則(資源取得即初始化)的偏差可能會損害物件的預期設計。
結論
雖然兩種方法都有其優點,但從構造函數拋出異常成為標準。透過儘早失敗,它可以防止創建不完整或不一致的對象,確保在執行任何進一步操作之前對象的狀態有效。
以上是構造函數應該拋出異常嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!