- exception[meta header]
- std[meta namespace]
- class[meta id-type]
namespace std {
class bad_exception : public exception;
}
- exception[link /reference/exception/exception.md]
bad_exception
は、不正な例外操作が行われた際に発生する例外クラスである。
動的例外仕様をもつ関数において、指定外の例外型を送出した際に、bad_exception
例外が発生する。
この場合のbad_exception
例外オブジェクトは自動で送出されるわけではなく、ユーザー自身がunexpected_handler
を指定してその中で例外オブジェクトの再送出を行うことで、bad_exception
例外が送出される。
std::current_exception()
関数を呼び出した際、現在発生している例外オブジェクトのコピーに失敗した場合に、無限再帰を回避するために実装がbad_exception
例外を送出する可能性がある。
- GCC 10およびClang 11の段階では、
std::current_exception()
関数は例外オブジェクトをコピーしないため、bad_exception
例外は発生しない - Visual C++では例外オブジェクトのコピーが再帰的に例外を発生させてしまう場合に、
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; |
実装定義のエラー内容を取得する |
#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;
}
}
- std::bad_exception[color ff0000]
- std::runtime_error[link /reference/stdexcept.md]
- std::invalid_argument[link /reference/stdexcept.md]
- std::set_unexpected[link set_unexpected.md]
caught: bad_exception.