欢迎来到入门教程网!

C语言

当前位置:主页 > 软件编程 > C语言 >

了解C++编程中指定的异常和未经处理的异常

来源:本站原创|时间:2020-01-10|栏目:C语言|点击:

noexcept
C++11:指定函数是否可能会引发异常。
语法

ReturnType FunctionName(params) noexcept;
ReturnType FunctionName(params) noexcept(noexcept(expression);

参数
表达式
计算结果是 True 或 False 的常量表达式。无条件版本相当于 noexcept(true)。
备注
noexcept(及其同义词 noecept(true))指定函数绝不会引发异常,或允许从异常直接或间接调用的任何其他函数传播异常。更具体地说,noexcept 意味着,仅当调用的所有函数也为 noexcept 或 const 并且没有要求运行时检查、应用于类型为多态类类型的 glvalue 表达式的 typeid 表达式或 throw 表达式的潜在已评估转换时,该函数才是 noexcept。但是,编译器不一定会检查可能归因于 noexcept 函数的异常的每个代码路径。如果异常确实到达标记为 noexcept 的函数,则会立即调用 std::terminate,并且不会保证将调用任何范围内对象的析构函数。
使用条件 noexcept 声明的且计算结果为 noexcept(false) 的函数指定它确实允许传播异常。例如,当要复制的对象是普通的旧数据类型 (POD) 时,可将复制其参数的函数声明为 noexcept。此类函数可以如下声明:

#include <type_traits>

template <typename T>
T copy_object(T& obj) noexcept(std::is_pod<T>)
{
 //. . . 
}

使用 noexcept 代替异常说明符 throw,后者在 C++11 和更高版本中已弃用。当你确信函数绝不允许异常传播到调用堆栈时,我们建议你将 noexcept 应用到函数。使用 noexcept 声明的函数使编译器可以在多种不同的上下文中生成更高效的代码。

未经处理的 C++ 异常
如果无法找到当前异常的匹配处理程序(或省略号 catch 处理程序),则调用预定义的 terminate 运行时函数。(您也可以在任意处理程序中显式调用 terminate。)terminate 的默认操作是调用 abort。如果您希望 terminate 在退出应用程序之前调用程序中的某些其他函数,则用被调用函数的名称作为其单个参数调用 set_terminate 函数。您可以在程序的任何点调用 set_terminate。 terminate 例程总是调用指定为 set_terminate 的参数的最后一个函数。
以下示例引发 char * 异常,但不包含用于捕获类型 char * 的异常的指定处理程序。对 set_terminate 的调用指示 terminate 调用 term_func。

// exceptions_Unhandled_Exceptions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void term_func() {
  cout << "term_func was called by terminate." << endl;
  exit( -1 );
}
int main() {
  try
  {
   set_terminate( term_func );
   throw "Out of memory!"; // No catch handler for this exception
  }
  catch( int )
  {
   cout << "Integer exception raised." << endl;
  }
  return 0;
}

输出:

term_func was called by terminate.

term_func 函数最好是通过调用 exit 来终止程序或当前线程。如果它没有这样做,而是返回到其调用方,则调用 abort。

上一篇:C++编程中指针的声明与基本使用讲解

栏    目:C语言

下一篇:详解C++编程中数组的基本用法

本文标题:了解C++编程中指定的异常和未经处理的异常

本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/2520.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有