首頁 > 後端開發 > C++ > 主體

構造函數應該拋出異常嗎?

Susan Sarandon
發布: 2024-11-10 07:36:02
原創
730 人瀏覽過

Should Exceptions Be Thrown from Constructors?

從建構子中拋出異常:設計注意事項

在軟體開發領域,關於從建構子中拋出異常是否合適的爭論一直存在。這個問題引發了程式設計愛好者的討論,最近一位同事的詢問促使我們深入研究這個主題。

從設計的角度來看,建構子拋出異常是否可以接受?

考慮一個類別封裝了POSIX 互斥體的場景,如範例所示下面:

class Mutex {
public:
  Mutex() {
    if (pthread_mutex_init(&mutex_, 0) != 0) {
      throw MutexInitException();
    }
  }
};
登入後複製

在這種情況下,如果對pthread_mutex_init 的呼叫失敗,則互斥對象將變得不可用。拋出例外可確保物件不會在不一致的狀態下創建,從而防止潛在的錯誤。

標準實踐與成員函數方法

有人可能會爭論該類別可以有一個用於初始化的成員函數,該函數根據pthread_mutex_init 呼叫的結果傳回一個布林值,而不是拋出異常。這種方法有其優點,但也帶來了一個微妙的問題。它依賴於每個使用者記住呼叫初始化函數,這可能會被忽略並導致未定義的行為。這種與 RAII 原則(資源取得即初始化)的偏差可能會損害物件的預期設計。

結論

雖然兩種方法都有其優點,但從構造函數拋出異常成為標準。透過儘早失敗,它可以防止創建不完整或不一致的對象,確保在執行任何進一步操作之前對象的狀態有效。

以上是構造函數應該拋出異常嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板