ZhiBing's blog(码上看世界) ZhiBing's blog(码上看世界)
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

ZhiBing Zheng

时间会回答成长
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • 编程语言

    • C++

      • 修改程序的启动函数
      • noexcept函数抛出异常会怎么样
      • shared_ptr(智能指针)
      • unique_ptr
      • bind函数
      • cout
      • C++ main函数的传入参数(argc, argv)
      • GLog使用
      • signals2
      • 编译期分派
      • 成员函数的调用效率
      • 返回值优化
      • 函数调用栈
      • 空类大小
      • 指针和数组的区别
      • 遵守三五原则
      • const限定符
      • static限定符
      • virtual限定符
      • 常用的CXX_FLAGS
      • 模版之AnyType
      • 模版之编译期断言
      • 模版之变参模板
    • Go

    • Python

    • shell

    • Rust

  • 调试

  • 开发者测试

  • 系统支撑

  • 性能优化

  • 小技巧

  • 通用领域
  • 编程语言
  • C++
zhengzhibing
2025-07-14

noexcept函数抛出异常会怎么样

# noexcept函数抛出异常会怎么样

noexcept关键字是向编译器声明此函数不会抛出异常,编译器可以使用此信息来对noexpect函数启用某些优化。

#include "gtest/gtest.h"
#include "glog/logging.h"

void func()
{
    throw std::runtime_error("func error");
}

TEST(test_other, case1)
{
    try {
        func();
    }
    catch (const std::exception& e) {
        LOG(ERROR) << e.what();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

对于用例一,func函数并没有声明noexcept,所以会被try catch捕获。

image-20250714194647648

接下来我们写用例二:

void func2() noexcept
{
    throw std::runtime_error("func error");
}

TEST(test_other, case2)
{
    try {
        func2();
    }
    catch (const std::exception& e) {
        LOG(ERROR) << e.what();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

image-20250714194759623

在上述代码中,func2函数声明为noexcept但抛出了异常,程序不会进入catch中,而是直接调用std::terminate,导致程序突然终止。

  • 编译器在编译声明了 noexcept 的函数时,会做一些优化,假设函数不会抛出异常,因此可以省略异常处理相关的代码生成,这能提高函数的执行效率。
  • 当异常真的发生时,由于没有合适的异常处理机制来妥善处理,就只能终止程序,以防止未定义行为的扩散。

如果一个函数内部调用了其他可能抛出异常的函数,且无法保证能捕获并处理这些异常,就不应该轻易声明为 noexcept。另外,在 C++ 标准库中,一些操作,如移动构造函数和移动赋值运算符,通常被声明为 noexcept,以提高性能和保证资源管理的安全性。如果自定义类型的移动操作可能抛出异常,就需要特别小心,否则可能导致程序意外终止。

#C++
修改程序的启动函数
shared_ptr(智能指针)

← 修改程序的启动函数 shared_ptr(智能指针)→

最近更新
01
修改程序的启动函数
07-13
02
本地(mac m2 mini(16G))部署deepseek-r1
02-02
03
安装oh-my-zsh
07-21
更多文章>
Theme by Vdoing | Copyright © 2022-2025 ZhBing Zheng | 粤ICP备2022062743号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式