C++ 异常处理:try、throw、catch 机制详解与实战

夏知夏
夏知夏
发布时间:2026-10-16| 5人浏览过
原创

C++ 的异常处理是一种在运行时自动处理错误的高效机制。它主要由 try(检测)、throw(抛出)和 catch(捕获)三个部分协同完成。当程序运行过程中发生预定义的异常情况时,系统会跳过后续代码转而进入对应的 catch 块进行安全处理,从而防止程序直接崩溃,保障数据的安全性和系统的稳定性。

一、异常处理的核心机制

C++ 的异常处理依赖于三个关键字的配合使用:

  • try:用于包含可能发生错误的代码块,即“检查区”。
  • throw:当检测到特定错误条件时,主动抛出一个异常对象,通常附带具体的错误信息或状态。
  • catch:紧跟在 try 块之后,用于接收并处理由 throw 抛出的异常类型。
// 基础语法结构
try 
{
    // 可能会触发异常的逻辑代码
}
catch (ExceptionType e)
{
    // 处理该类型异常的代码
}

其执行逻辑为:若 try 块内发生错误,程序控制权立即转移至匹配的 catch 块;若未出错,则自动跳过所有 catch 块继续向下执行。

二、实战应用:基于三角形的异常计算

为了演示 try-catch-throw 的完整工作流程,我们编写一个计算三角形面积的示例。如果输入的三条边长不满足构成三角形的条件(如两边之和小于等于第三边),或者数值无效,函数将手动抛出异常,由主程序的 try-catch 模块统一拦截处理,避免程序崩溃。

第1步:定义带有抛出能力的计算函数

首先创建独立函数 triangler,在其中加入严格的边界校验。若不符合几何规则,则利用 throw a; 终止当前函数调用并向上抛出异常对象。

double triangler(double a, double b, double c)
{
    // 海伦公式计算逻辑前需验证合法性
    if (a + b <= c || a + c <= b || b + c <= a) 
        throw a;		// 抛出当前边长 a 作为异常标识
	    return sqrt(s * (s - a) * (s - b) * (s - c));
}

第2步:在主函数中建立捕获闭环

在主程序中读取用户输入,并将其包裹进 try 结构中。针对上述可能出现的各类未知类型错误,使用通用捕获符 (...) 进行兜底处理。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    double triangler(double a, double b, double c);
    {
        double a, b, c;
        cin >> a >> b >> c;
        try                                // 启动监控区域
        {
            while (a > 0 && b > 0 && &c > 0)
            {
                cout << triangler(a, b, c) << endl;	
                cin >> a >> b >> c;
            }
        }
        // catch (double)                    可以指定精确类型,但不够灵活
        // {
        //     {cout << "That is not a triangler!" << endl; }
        //     cout << "end" << endl;
        // }
        catch (...)										// “...”代表可以捕获任何类型的异常
        {
            {cout << "a=" << a << ",b=" << b << ",c=" << c << ",that is not a triangler! it is all typical!" << endl; }
            cout << "end" << endl;
        }
    }
}

三、关键规则与注意事项

1. 执行流控制与非阻塞特性

在 try 语句下遇到错误,程序会自动执行 throw 并退出一级调用栈。重要的是,即使捕获到了异常并完成了处理(进入 catch 子句),**程序并不会自动终止**。它会按正常流程继续执行 catch 块之后的代码。反之,如果没有发现异常,也会直接跨越整个 catch 结构向下运行。

2. 参数匹配原则

throw 抛出的数据类型可以是任意值,而紧随其后的 catch(参数) 括号中必须写清楚想要拦截的数据类型。例如,只写 catch(int) 只能拦截整型异常。对于懒得区分具体类型的需求,可以在括号内写上三个点 (...),这代表它能捕获一切类型(All types)的异常。

3. 跨函数传播与就近原则

try-catch 结构与发出异常的 throw 不需要在同一个函数,甚至不需要在同一文件里。当一个异常被抛出后,系统会沿调用栈寻找最近的 try-catch 结构。如果在当前函数找不到匹配的 try,则会采取“就近原则”向上一级调用者回退搜索,直到找到能处理它的 try 或是程序直接崩溃退出。

4. 语法规则限制

try 块和 catch 块的结合存在严格限制:**可以单独出现 try(后面接其他块时除外),但不能在没有 try 的情况下单独放置 catch**。

以上就是 C++ 异常处理 try throw catch 用法的详细内容,更多关于 C++ 异常处理的基础操作资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。