c++ - 将函数声明为 __attribute__(nothrow) 和 `throw()` 有什么区别

标签 c++ exception-handling

在使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03).

据我了解,这两种变体都是告诉编译器该函数不会抛出异常。但实现可能不同

编译器将如何使用这些信息?

如果我在 nothrow 或 throw() 函数中运行时抛出异常,并且此异常将传递给该函数怎么办?函数会进一步传递异常还是会隐藏异常或其他东西?

最佳答案

有几点不同:

  1. __attribute__((...)) 语法是一个 gnu 编译器扩展,它不是完全可移植的,throw() 是由 C++ 定义的标准。

  2. 如果我没看错,__attribute__((nothrow)) 会告诉编译器它可以安全地假设一个函数不会引发异常,并且可能会忽略发出一些代码异常处理所必需的(这是在调用方)。另一方面,throw() 隐含地捕获由相关函数引起的所有异常,并在捕获到异常时通过首先调用意外异常处理程序终止程序,该处理程序默认调用 terminate()(这发生在被调用方)。

在编程方面,throw() 更有用,因为它可以保护您的代码不被异常悄悄跳过。当我处理一个使用异常的项目时,我会特别注意将 throw() 添加到我编写的每个函数中。

但是请注意,__attribute__((nothrow))throw() 都不会导致编译器实际检查是否不会抛出异常。这是非常不幸的,但 C++ 标准明确指出,编译器不得在用 throw() 声明的函数中抛出错误。

关于c++ - 将函数声明为 __attribute__(nothrow) 和 `throw()` 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19325607/

相关文章:

c++ - 包括带有 Clang/LLVM 的 C++ 11 头文件

c++ - 当对象同时提供 `operator!` 和 `operator bool` 时,在表达式 `!obj` 中使用?

C++ 复杂的 lambda 表达式

php - Yii2 在控制台模式下捕获异常

php - PHP 中的异常真的那么有用吗?

c++ - 扭曲双向链表

c++ - Qt QList<T> 转换和 node_copy

haskell - 在 Haskell 中捕获异常

php - 如何在 Laravel 5 中处理异常和错误信息?

java - 具有不同错误消息的相同异常类型