簡體   English   中英

C ++構造函數中的自定義異常throw()

[英]C++ Custom exception throw () in constructor

所以我讀到你不應該在自定義異常類中擁有除基本類型之外的任何東西,否則它可能會在異常中引發異常(就像夢中的夢一樣)。 並且你應該按價值拋出並通過ref捕獲。

我將此作為我的異常類標題:

class DeepthroatException : public std::runtime_error {
  public:
  DeepthroatException(const char* err); // set err member to err

  private:
  // Error description
  const char* err;
};

但我不喜歡它,因為它引入了內存管理的問題,肉眼看不見,我需要使用探測器。 如果可能,我想更改為std::string

但是上面的第一段中有問題,所以我想這樣做:

#include <string>
class DeepthroatException : public std::runtime_error {
  public:
  DeepthroatException(std::string err) throw(); // set err member to err, no throw

  private:
  // Error description
  std::string err;
};

這樣可以嗎?

使用std::string也可以使用std::bad_alloc給你帶來不好的時間。 但是這個問題已經是std::runtime_error所固有的,因為它的構造函數可以將std::string作為參數:

explicit runtime_error( const std::string& what_arg );
explicit runtime_error( const char* what_arg );

這只是這種方式,因為復制異常永遠不會拋出,因此實現可能會分配另一個字符串並將參數的內容復制到它。 如果你真的不想拋出第二個異常,請將你的構造函數標記為noexcept並確保它永遠不會失敗,如果它曾經這樣做,你的程序將立即關閉。

您可以通過使用構造函數中的字符串構造它來繼承std::runtime_error行為,如下所示:

DeepthroatException(const std::string& err) noexcept :
    std::runtime_error(err)
{
    // ...
}

此時,您可以刪除您的err數據成員,因為runtime_error將為您提供內部字符串,您可以通過what()引用該字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM