函数
<exception>

std::set_unexpected

unexpected_handler set_unexpected (unexpected_handler f) throw();
unexpected_handler set_unexpected (unexpected_handler f) noexcept;
设置意外处理函数
f设置为意外处理函数

当一个函数抛出一个不在其动态异常说明(即在其throw说明符)中的异常时,意外处理函数会被自动调用。

意外处理函数可以处理该异常,并且应以终止(调用terminate或其他方法,如exitabort)或抛出异常(甚至重新抛出相同的异常)来结束。如果抛出(或重新抛出)的异常不在函数的动态异常说明中,但抛出的是bad_exception,则会抛出bad_exception。否则,如果新的异常也不在动态异常说明中,则会自动调用terminate

在程序第一次调用此函数之前,默认行为是调用terminate

参数

f
不接受任何参数且不返回任何值的函数(void)。
该函数不应返回。它应该抛出异常或终止。
unexpected_handler是一种函数指针类型,不接受任何参数并返回void

返回值

先前存在的意外处理函数(如果存在)。这可能是一个空指针
unexpected_handler是一种函数指针类型,不接受任何参数且不返回任何值。

兼容性

*dynamic-exception-specifier*的使用已被弃用(自C++11起)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// set_unexpected example
#include <iostream>       // std::cerr
#include <exception>      // std::set_unexpected

void myunexpected () {
  std::cerr << "unexpected called\n";
  throw 0;     // throws int (in exception-specification)
}

void myfunction () throw (int) {
  throw 'x';   // throws char (not in exception-specification)
}

int main (void) {
  std::set_unexpected (myunexpected);
  try {
    myfunction();
  }
  catch (int) { std::cerr << "caught int\n"; }
  catch (...) { std::cerr << "caught some other exception type\n"; }
  return 0;
}

输出

unexpected called
caught int


数据竞争

调用此函数不得引发数据竞争,并且所有此类调用都与后续对set_unexpectedget_unexpected的调用同步。

请注意,此要求仅适用于set_unexpected函数,但不一定适用于作为参数(f)传递的意外处理函数

异常安全

无抛出保证:此函数(set_unexpected)从不抛出异常。

请注意,如果f是一个未实现适当功能(如上所述)的函数,或者f是一个无效指针或空指针,则会导致未定义行为

另见