std::runtime_error是否会终止程序

std::runtime_error 本身不会直接导致程序终止,程序是否终止取决于该异常是否被正确捕获(处理)。

一、核心原理说明

  1. std::runtime_error 是C++标准库中的异常类(继承自 std::exception ),它的作用仅仅是"标识一种运行时错误场景"并被抛出,本身不包含任何终止程序的逻辑。
  2. 异常抛出后(通过 throw std::runtime_error("错误信息") ),程序会进入"异常传播流程":从抛出异常的函数开始,逐层向上回溯调用栈,寻找匹配的 catch 块来处理该异常。

二、两种核心场景(决定程序是否终止)

场景1:异常被 catch 块捕获处理------程序不会终止

如果在异常传播路径上,存在匹配的 catch 块(可直接捕获 std::runtime_error ,或其父类 std::exception ),异常会被处理,程序会从 catch 块之后继续执行,不会终止。

示例代码:

cpp 复制代码
  
#include <iostream>
#include <stdexcept>
#include <string>

// 可能抛出std::runtime_error的函数
void do_some_operation(int value) {
    if (value < 0) {
        // 抛出std::runtime_error异常,仅标识错误,不终止程序
        throw std::runtime_error("运行时错误:输入值不能为负数");
    }
    std::cout << "操作执行成功,输入值:" << value << std::endl;
}

int main() {
    int input = -10;

    // 使用try-catch捕获异常
    try {
        do_some_operation(input);
    }
    // 匹配std::runtime_error异常,进行处理
    catch (const std::runtime_error& e) {
        std::cerr << "捕获到异常:" << e.what() << std::endl;
    }
    // 可选:捕获所有std::exception派生异常
    catch (const std::exception& e) {
        std::cerr << "捕获到通用异常:" << e.what() << std::endl;
    }

    // 异常处理后,程序继续执行此处
    std::cout << "程序未终止,继续运行..." << std::endl;
    return 0;
}

运行结果(程序正常执行完毕,不终止):

plaintext 复制代码
  
捕获到异常:运行时错误:输入值不能为负数
程序未终止,继续运行...

场景2:异常未被捕获(未找到匹配的 catch 块)------程序终止

如果异常传播到调用栈的顶层(通常是 main 函数),仍然没有找到匹配的 catch 块,会触发C++运行时库的默认未捕获异常处理机制:

  1. 首先调用 std::terminate() 函数;
  2. std::terminate() 默认会调用 std::abort() ,最终导致程序异常终止(退出码非0,且不会执行后续代码、不会正常析构局部对象等)。

示例代码(无 catch 块捕获异常):

cpp 复制代码
 
#include <iostream>
#include <stdexcept>

void do_some_operation(int value) {
   if (value < 0) {
       throw std::runtime_error("运行时错误:输入值不能为负数");
   }
}

int main() {
   int input = -10;
   // 抛出异常,但无任何catch块处理
   do_some_operation(input);

   // 以下代码永远不会执行
   std::cout << "程序继续运行..." << std::endl;
   return 0;
}

运行结果(程序异常终止):

plaintext 复制代码
 
terminate called after throwing an instance of 'std::runtime_error'
 what():  运行时错误:输入值不能为负数
Aborted (core dumped)

三、补充说明

  1. 未捕获异常导致的程序终止是"异常终止",不同于正常退出( return 0 ),可能会造成资源泄露(如堆内存未释放、文件未关闭等),因为局部对象的析构函数可能无法被正常调用。
  2. 可以通过 std::set_terminate() 自定义 std::terminate() 的回调函数,但这只能用于做退出前的清理工作,无法阻止程序终止。
  3. std::runtime_error 是运行时异常,通常用于表示"程序运行期间才能够检测到的错误"(如输入非法、资源不足等),与编译期错误无关。

总结

  1. std::runtime_error 本身不终止程序,它只是被抛出的异常对象;
  2. 被 catch 块正确捕获→程序继续执行,不终止;
  3. 未被捕获→触发 std::terminate() →程序异常终止。
相关推荐
小欣加油6 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
星恒随风7 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
浪客灿心7 小时前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q8 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
为何创造硅基生物10 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~10 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz10 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂10 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
起床困难户57511 小时前
条款20:协助完成返回值优化
c++
啦啦啦啦啦zzzz11 小时前
算法总结(二分查找、双指针)
c++·算法