• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class
    <exception>

    std::bad_exception

    namespace std {
      class bad_exception : public exception;
    }
    

    概要

    bad_exceptionは、不正な例外操作が行われた際に発生する例外クラスである。

    動的例外仕様に違反した例外送出に対する例外 (C++14まで)

    動的例外仕様をもつ関数において、指定外の例外型を送出した際に、bad_exception例外が発生する。

    この場合のbad_exception例外オブジェクトは自動で送出されるわけではなく、ユーザー自身がunexpected_handlerを指定してその中で例外オブジェクトの再送出を行うことで、bad_exception例外が送出される。

    例外オブジェクトをコピーする際に例外が送出されたことに対する例外 (C++11)

    std::current_exception()関数を呼び出した際、現在発生している例外オブジェクトのコピーに失敗した場合に、無限再帰を回避するために実装がbad_exception例外を送出する可能性がある。

    備考

    メンバ関数

    名前 説明 対応バージョン
    bad_exception() noexcept; bad_exception(const bad_exception&) noexcept; コンストラクタ
    virtual ~bad_exception() = default; デストラクタ
    bad_exception& operator=(const bad_exception&) noexcept; 代入演算子
    virtual const char* what() const noexcept; 実装定義のエラー内容を取得する

    動的例外仕様に違反した例外を送出する例 (C++14まで)

    #include <exception>
    #include <stdexcept>
    #include <iostream>
    
    void user_unexpected()
    {
      throw;
    }
    
    void not_runtime_error_throw() throw(std::runtime_error, std::bad_exception)
    {
      throw std::invalid_argument("throw invalid_argument.");
    }
    
    int main()
    {
      std::set_unexpected(user_unexpected);
    
      // std::runtime_error以外を送出
      try {
        not_runtime_error_throw();
      }
      catch (std::runtime_error& ex) {
        std::cout << "caught: " << ex.what() << std::endl;
      }
      catch (std::bad_exception& ex) {
        std::cout << "caught: bad_exception." << std::endl;
      }
    }
    

    出力

    caught: bad_exception.
    

    関連項目