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

c++的异常处理机制(try、catch、throw)

在C++中,异常处理机制通过trycatchthrow来管理程序运行时的错误情况。异常处理机制使得程序能够在出现错误时优雅地恢复或处理错误,而不是让程序崩溃。以下是关于C++异常处理的详细讲解

1. throw 关键字

throw用于抛出异常。异常是一个表示错误或异常情况的对象。当代码中出现问题时,可以使用throw来创建一个异常对象并将其抛出。

示例:

#include <iostream>
#include <stdexcept> // std::runtime_errorvoid mightGoWrong() {bool errorOccurred = true; // 假设发生了错误if (errorOccurred) {throw std::runtime_error("Something went wrong");}
}int main() {try {mightGoWrong();} catch (const std::exception& e) {std::cout << "Caught an exception: " << e.what() << std::endl;}return 0;
}

2. try 关键字

try块用于包含可能会抛出异常的代码。如果try块中的代码抛出了异常,那么控制流将转移到相应的catch块来处理该异常。

示例:

#include <iostream>void mightGoWrong() {throw std::runtime_error("An error occurred");
}int main() {try {mightGoWrong(); // 可能抛出异常} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;}return 0;
}

3. catch 关键字

catch用于捕获try块中抛出的异常。catch块指定了要捕获的异常类型,并处理该异常。可以定义多个catch块来捕获不同类型的异常。

示例:

#include <iostream>
#include <stdexcept>void mightGoWrong() {throw std::runtime_error("Runtime error occurred");
}int main() {try {mightGoWrong();} catch (const std::runtime_error& e) {std::cout << "Caught runtime_error: " << e.what() << std::endl;} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;}return 0;
}

异常处理机制的工作流程

  1. 抛出异常: 当throw语句被执行时,程序会创建一个异常对象并将其抛出。控制流将立即转移到try块外的catch块中。

  2. 捕获异常: catch块负责捕获和处理异常。它根据异常的类型和参数,决定如何处理异常。catch块可以捕获具体类型的异常,也可以捕获基类异常(如std::exception)。

  3. 异常传播: 如果try块中抛出的异常没有被相应的catch块捕获,异常会沿着调用栈向上传播,直到找到匹配的catch块为止。如果在栈的顶端仍然没有捕获到该异常,程序将终止。

自定义异常

可以创建自定义异常类,继承自标准异常类(如std::exception)或其他异常类。

示例:

#include <iostream>
#include <exception>class MyException : public std::exception {
public:const char* what() const noexcept override {return "MyException occurred";}
};void mightGoWrong() {throw MyException();
}int main() {try {mightGoWrong();} catch (const MyException& e) {std::cout << "Caught MyException: " << e.what() << std::endl;} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;}return 0;
}

异常安全

  • 基本保证: 程序在异常发生时,能保证程序状态的一致性。

  • 强保证: 在异常发生时,程序的状态与没有异常时完全相同。

  • 无异常保证: 函数在任何情况下都不会抛出异常。

在C++中,异常处理机制使得程序可以更优雅地处理运行时错误,通过适当的trycatchthrow使用,可以提高程序的健壮性和容错能力。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PDF——分割pdf的10个工具
  • 基于STC89C52单片机的U盘设计
  • SVN工作原理和使用示例
  • conda pack迁移环境
  • leetcode-121-买卖股票的最佳时机
  • Java数组1
  • 数据库篇--八股文学习第十七天| 什么是慢查询?原因是什么?可以怎么优化?;undo log、redo log、binlog 有什么用?
  • 笔记:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别
  • 知识改变命运:Java 语言 【可变参数】
  • 【竞品分析】案例分析:直播类竞品分析,理解什么是竞品。
  • 怎样在 SQL 中创建视图(VIEW),以及视图的作用和优势是什么?
  • 【递归 + 记忆化搜索优化】力扣494. 目标和
  • Linux小组件:makefile
  • 基于单片机的智能风扇设计
  • DLMS/COSEM中的信息安全:安全密钥(中)续2
  • [数据结构]链表的实现在PHP中
  • 「译」Node.js Streams 基础
  • 2017 年终总结 —— 在路上
  • Angular 响应式表单 基础例子
  • Apache Spark Streaming 使用实例
  • css选择器
  • ES6--对象的扩展
  • es的写入过程
  • Hibernate最全面试题
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript设计模式之工厂模式
  • java第三方包学习之lombok
  • js继承的实现方法
  • Laravel 中的一个后期静态绑定
  • Octave 入门
  • swift基础之_对象 实例方法 对象方法。
  • 对超线程几个不同角度的解释
  • 理清楚Vue的结构
  • 因为阿里,他们成了“杭漂”
  • scrapy中间件源码分析及常用中间件大全
  • 数据库巡检项
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $.ajax()方法详解
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C++17) optional的使用
  • (C++20) consteval立即函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二)WCF的Binding模型
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)linux文件内容查看
  • (一) springboot详细介绍
  • (一)RocketMQ初步认识
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉)JSON.stringify 语法实例讲解