当前位置: 首页 > news >正文

C++青少年简明教程:异常处理

C++青少年简明教程:异常处理

在C++中,异常处理是一种处理程序运行时错误的机制。它允许程序在发生错误时,不立即终止,而是跳转到一个特定的代码块(称为捕获块或catch块)来处理该错误。

异常处理主要由三个关键字组成:

try: 用于标记可能抛出异常的代码块。

throw: 用于抛出异常,通常在检测到错误条件时使用。

catch: 用于捕获异常,并定义如何处理捕获到的异常。

C++标准库提供了多种异常类, <stdexcept>头文件,它是 C++ 标准库的一部分,包含了一些用于异常处理的标准异常类,这些异常类派生自 std::exception 基类,提供了一种标准化的方法来表示和处理错误情况:

std::exception:所有标准异常类的基类。

std::bad_alloc:在申请内存失败时抛出。

std::bad_cast:将一个指向派生类的基类指针强制转换为派生类指针时,如果类型不匹配,则抛出。

std::ios_base::failure:I/O 操作失败时抛出。

std::out_of_range:数组访问越界时抛出。

std::invalid_argument:提供无效参数时抛出。

std::length_error:尝试创建一个超出可分配内存大小的 vector、string 等时抛出。

std::logic_error:逻辑错误(如程序中的 bug),通常有一些派生类总结不同的情况(此类异常可以在编译环境中静态检查出来)。

std::runtime_error:运行时错误,通常由外部原因(如文件、网络等)引起。

这些异常类设计用于解决常见的错误情况,支持许多常见的内部错误处理。通过使用标准异常类,程序员可以避免一些常见的错误,并且在发生异常时能够捕获并处理它们,防止程序崩溃。

此外,C++ 允许程序员创建自定义异常类以精细控制异常处理。自己的异常类,通常派生自 std::exception 或其子类。

示例、检测无效参数

#include <iostream>
#include <stdexcept>
using namespace std;void checkAge(int age) {if (age < 0) {throw invalid_argument("年龄不能是负数");}
}int main() {int age;bool validInput = false;while (!validInput) {cout << "输入年龄: ";cin >> age;try {checkAge(age);validInput = true;} catch (const invalid_argument& e) {cout << "Exception: " << e.what() << endl;}}cout << "输入的有效年龄: " << age << endl;return 0;
}

示例程序运行时,将提示用户输入年龄值,如果用户输入了非负整数,程序将正常退出;否则,程序会继续循环,等待用户输入新的值。

需要注意的是,对于一些底层操作(如整数除零、越界访问数组等),C++标准并未强制要求抛出异常,而是定义为未定义行为。C++中,整数除以零是未定义行为(Undefined Behavior),而不是通过抛出标准异常(如 std::exception)来处理。应如何处理呢?请参考下面示例:

#include <iostream>
#include <stdexcept>
using namespace std;int divide(int a, int b) {if (b == 0) {throw runtime_error("Divide by zero");}return a / b;
}int main() {try {int a = 10, b = 0;int result = divide(a, b);cout << "result = " << result << endl;} catch (const runtime_error& e) {cout << "Exception: " << e.what() << endl;}return 0;
}

在这个例子中,使用 #include <stdexcept> 来引入标准异常类 std::runtime_error,并在除零时抛出该异常。我们定义了divide函数,在分母为0时抛出runtime_error异常。在main函数中,我们捕获了这个异常并进行处理。

现在,给出一个自己的异常类示例:

#include <iostream>
#include <stdexcept> // 引入 stdexcept 头文件
using namespace std;// 自定义异常类,派生自 std::runtime_error
class MyException : public runtime_error {
public:// 构造函数,接受一个错误信息MyException(const string& message) : runtime_error(message) {}
};// 使用自定义异常类的函数
void testFunction(bool throwError) {if (throwError) {throw MyException("Custom exception occurred"); // 抛出自定义异常}
}int main() {try {testFunction(true);} catch (const MyException& e) {cout << "Exception: " << e.what() << endl; // 捕获并处理 MyException 异常}return 0;
}

这段代码展示了如何定义一个自定义异常类 MyException,继承自 std::runtime_error。它还演示了如何在函数中抛出自定义异常,以及在 main 函数中捕获并处理该异常。代码能够正常编译和运行,并会输出:

Exception: Custom exception occurred

附、C++异常处理 https://blog.csdn.net/cnds123/article/details/109667491

相关文章:

  • 压缩列表(ziplist)
  • 基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[3]-参数配置详细版
  • 【启明智显分享】国产HMI芯片Model系列:平头哥内核,SDK开源贯彻到底!
  • MySQL-DDL(Data Definition Language)
  • 腾讯云点播ugc upload | lack signature 问题处理
  • Excel和Word等工具小技能分享汇编(一)
  • ffmpeg把视频文件转码为MP4格式
  • mac安装高版本git(更新git)
  • 后端常见问题解答-位运算实际场景讲解
  • 【odoo | SQL】odoo使用sql语句操作数据库
  • 工具:安装R语言的R包的各种方法
  • 大腾智能正式入驻华为云
  • 未来已来:低代码平台如何重塑企业数字化策略?
  • 你知道花洒其实起源于中国古代吗?
  • 【我是产品经理_注册安全分析报告】
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【5+】跨webview多页面 触发事件(二)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS实用技巧
  • Django 博客开发教程 8 - 博客文章详情页
  • JavaScript的使用你知道几种?(上)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • LeetCode29.两数相除 JavaScript
  • QQ浏览器x5内核的兼容性问题
  • Web设计流程优化:网页效果图设计新思路
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 老板让我十分钟上手nx-admin
  • 马上搞懂 GeoJSON
  • 悄悄地说一个bug
  • 我从编程教室毕业
  • 找一份好的前端工作,起点很重要
  • 06-01 点餐小程序前台界面搭建
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (实战篇)如何缓存数据
  • (原)本想说脏话,奈何已放下
  • (转)大型网站的系统架构
  • (转载)虚函数剖析
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **PHP二维数组遍历时同时赋值
  • ./和../以及/和~之间的区别
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Micro Framework 4.2 beta 源码探析
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • @component注解的分类
  • @FeignClient注解,fallback和fallbackFactory
  • [ Linux ] Linux信号概述 信号的产生
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)