Skip to content

Latest commit

 

History

History
91 lines (70 loc) · 3.22 KB

current_exception.md

File metadata and controls

91 lines (70 loc) · 3.22 KB

current_exception

  • exception[meta header]
  • std[meta namespace]
  • function[meta id-type]
  • cpp11[meta cpp]
namespace std {
  exception_ptr current_exception() noexcept;
}
  • exception_ptr[link exception_ptr.md]

概要

現在処理中の例外オブジェクトを指すexception_ptrを取得する。

戻り値

  • 現在処理中の例外オブジェクトを指すexception_ptrを返す
  • 処理中の例外オブジェクトがない場合は、ヌルを指すexception_ptrを返す
  • この関数がメモリ確保する必要があり、それに失敗した場合、bad_allocオブジェクトを指すexception_ptrを返す
  • この関数を2回以上呼び出した場合に、同じオブジェクトを指すexception_ptrが返るとは限らない。(呼び出しのたびに例外オブジェクトを作る可能性がある)
  • 例外オブジェクトをコピーする際に例外が送出された場合、送出された例外オブジェクトを指すexception_ptrを返す
    • ただし、無限再帰を回避するために、bad_exceptionオブジェクトを指すexception_ptrを返すことが実装に許可される

例外

投げない

備考

この関数は、catch節で使用すれば、処理中の例外オブジェクトへの例外ポインタを取得できる。

ただし、例外送出によるスタック巻き戻し中は、取得できないので注意。(スタック巻き戻し中とは、tryブロック中で定義されたオブジェクトのデストラクタのこと)

#include <iostream>
#include <exception>
#include <stdexcept>

int main()
{
  std::exception_ptr ep;

  try {
    throw std::runtime_error("error!");
  }
  catch (...) {
    std::cout << "catch" << std::endl;
    ep = std::current_exception(); // 処理中の例外ポインタを取得
  }

  if (ep) {
    std::cout << "rethrow" << std::endl;
    std::rethrow_exception(ep); // 再スロー
  }
}
  • std::current_exception[color ff0000]
  • std::exception_ptr[link exception_ptr.md]
  • std::runtime_error[link /reference/stdexcept.md]
  • std::rethrow_exception[link rethrow_exception.md]

出力例

catch
rethrow

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::runtime_error'
  what():  error!

バージョン

言語

  • C++11

処理系

  • Clang: ??
  • GCC: 4.6.1 [mark verified]
  • ICC: ??
  • Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 [mark verified], 2015 [mark verified]

参照