【C++】错误处理机制

C++ 提供了多种错误处理机制,用于在程序中检测和处理异常情况。这些机制包括异常处理、错误返回码、断言(assert)以及其他自定义的错误处理方法。以下是对 C++ 错误处理机制的详细介绍:

1. 异常处理(Exception Handling)

异常处理是 C++ 提供的主要错误处理机制,使用 trycatchthrow 关键字来捕获和处理错误。

基本语法
try {// 可能抛出异常的代码if (someErrorCondition) {throw std::runtime_error("An error occurred");}
} catch (const std::exception& e) {// 处理异常std::cerr << "Caught exception: " << e.what() << std::endl;
}
详细示例
#include <iostream>
#include <stdexcept>void mightThrow() {throw std::runtime_error("An unexpected error occurred");
}int main() {try {mightThrow();} catch (const std::exception& e) {std::cerr << "Caught exception: " << e.what() << std::endl;}return 0;
}
自定义异常类
#include <iostream>
#include <exception>class MyException : public std::exception {
public:const char* what() const noexcept override {return "My custom exception occurred";}
};void functionThatThrows() {throw MyException();
}int main() {try {functionThatThrows();} catch (const MyException& e) {std::cerr << "Caught custom exception: " << e.what() << std::endl;}return 0;
}

2. 错误返回码

使用返回码是另一种常见的错误处理方法,特别是在异常开销不合适的情况下。通过函数返回值指示错误,并在调用处检查这些返回值。

示例
#include <iostream>enum class ErrorCode {SUCCESS,ERROR_DIVIDE_BY_ZERO
};ErrorCode divide(int a, int b, int& result) {if (b == 0) {return ErrorCode::ERROR_DIVIDE_BY_ZERO;}result = a / b;return ErrorCode::SUCCESS;
}int main() {int result;ErrorCode code = divide(10, 0, result);if (code == ErrorCode::ERROR_DIVIDE_BY_ZERO) {std::cerr << "Error: Division by zero" << std::endl;} else {std::cout << "Result: " << result << std::endl;}return 0;
}

3. 断言(Assert)

断言用于在调试阶段捕捉不可恢复的错误。它在条件为假时终止程序执行并打印错误信息。适用于开发阶段的调试。

示例
#include <iostream>
#include <cassert>int divide(int a, int b) {assert(b != 0); // 确保除数不为零return a / b;
}int main() {int result = divide(10, 2);std::cout << "10 / 2 = " << result << std::endl;// 这行代码将触发 assert,因为 b 为 0result = divide(10, 0);std::cout << "10 / 0 = " << result << std::endl;return 0;
}

4. 日志记录

日志记录是一种监控和记录错误发生情况的方法,常用于生产环境中进行故障排查。

示例
#include <iostream>
#include <fstream>
#include <stdexcept>void logError(const std::string& message) {std::ofstream logFile("error.log", std::ios_base::app);logFile << message << std::endl;
}void functionThatMightFail() {throw std::runtime_error("An error occurred");
}int main() {try {functionThatMightFail();} catch (const std::exception& e) {logError(e.what());std::cerr << "Caught exception: " << e.what() << std::endl;}return 0;
}

5. 条件检查和防御性编程

通过条件检查在运行时防止错误发生,例如参数验证。

示例
#include <iostream>void processInput(int input) {if (input < 0) {std::cerr << "Error: input must be non-negative" << std::endl;return;}// 处理输入
}int main() {processInput(-1);processInput(10);return 0;
}

6. 总结

  • 异常处理:用于捕获和处理运行时错误,适合处理不可预见的异常情况。
  • 错误返回码:适用于函数调用链中明确的错误检查,常用于嵌入式系统和性能敏感的代码。
  • 断言:用于开发阶段捕捉编程错误,发布版本通常禁用。
  • 日志记录:用于记录和追踪错误,帮助调试和维护。
  • 条件检查和防御性编程:通过提前检查条件防止错误发生。

根据具体情况和需求,选择适合的错误处理机制可以提高程序的健壮性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3前端开发-小兔鲜项目-热门品牌推荐栏目

vue3前端开发-小兔鲜项目-热门品牌推荐栏目&#xff01;这一期内容&#xff0c;大家一定要认真的看完。因为&#xff0c;黑马官方教程视频里面老师没有讲这个&#xff0c;但是内容其实不难。只是按照之前的流程操作就行了。我把自己写好的代码分享给大家。做个参考demo。 第一步…

可用内存为什么可以超过实际内存

一、虚拟CPU和虚拟内存&#xff1a; 1、虚拟cpu&#xff1a; 利用进程机制&#xff0c;所有的现代操作系统都支持在同一时间来完成多个任务。尽管某个时刻&#xff0c;真实的CPU只能运行一个进程&#xff0c;但是从进程自己的角度来看&#xff0c;它会认为自己在独享CPU&…

安科瑞受邀参加2024年杭州建筑电气年会

24年7月4-5日&#xff0c;由杭州市土木建筑学会建筑电气专业委员会主办&#xff0c;中国联合工程有限公司&#xff0c;浙江省建设投资集团股份有限公司工程设计总院&#xff0c;大象建筑设计有限公司承办的2024年杭州建筑电气年会在杭州万华国际酒店隆重举办。杭州市各设计院所…

基于深度学习的超分辨率

基于深度学习的超分辨率&#xff08;Super-Resolution, SR&#xff09;技术旨在从低分辨率&#xff08;Low-Resolution, LR&#xff09;图像中重建出高分辨率&#xff08;High-Resolution, HR&#xff09;图像。超分辨率技术在医疗影像、卫星图像、视频处理、安防监控等领域有着…

服务器数据恢复—RAID5阵列重建重建导致数据丢失的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器&#xff0c;有一组由5块硬盘组建的raid5磁盘阵列。 服务器在运行过程中一块有磁盘掉线&#xff0c;由于raid5阵列支持一块磁盘掉线的特性&#xff0c;服务器还在正常工作。不久之后服务器出现故障&#xff0c;管理员在不了…

【洁净室】压缩气体检测参考标准:悬浮粒子、微生物、水油检测

在洁净室&#xff0c;特别是达到ISO 5或更高级别的环境中&#xff0c;维护严格的污染控制是不可或缺的。其中&#xff0c;压缩气体的质量是一个至关重要的潜在污染源。为确保压缩气体不会引入损害洁净室完整性的微粒&#xff0c;适当的气体取样成为了一项核心任务。国际标准ISO…

C2W1.LAB.Vocabulary Creation+Candidates from String Edits

理论课&#xff1a;C2W1.Auto-correct 文章目录 Vocabulary CreationImports and DataPreprocessingCreate Vocabulary法1.集合法法2.词典加词频法Visualization Ungraded Exercise Candidates from String EditsImports and DataSplitsDelete Edit Ungraded Exercise 理论课&…

OpenCV 轮廓检测

在 OpenCV 中&#xff0c;轮廓检测是一种用于查找图像中具有相似颜色或强度的连通像素组的技术&#xff0c;这些像素组通常代表了图像中的物体边缘。轮廓可以用来识别和分割图像中的物体&#xff0c;是计算机视觉应用中的一个重要步骤&#xff0c;如目标识别、形状分析等。 轮…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程① | 5.1 - 5.3

前言 第5章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.1 软件工程定义 5.2 软件需求 5.2.1 需求的层次 5.2.2 质量功能部署 5.2.3 需求获取 5.2.4 需求分析 5.2.5 需求规格说明书 5.2.6 需求变…

NestJS笔记

概述&#xff1a;本篇文章是NestJS笔记&#xff0c;包括了Nest的基本使用、连接数据库、日志操作。 一、NestJS 官方 cli 1. 快速上手 1.1 全局安装 cli npm i -g nestjs/cli1.2 创建项目 nest new [项目名]1.3 查看项目命令 查看 nest 命令 Usage: nest <command>…

使用 JavaScript 实现图片上传

首先&#xff0c;我们需要创建一个包含用于显示图片预览和文件输入的 HTML 页面。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

Assignments

目录 1、 Assignments.cshtml 1.1、 Content body start 1.2、 <!-- row --> 1.3、 Content body end Assignments.cshtml@{

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…

获取淘宝商品详情app原数据item_get_app响应参数解析(二):商品标题、销量、sku、价格、视频

API名&#xff1a;item_get_app 功能说明&#xff1a;通过传入商品id获取该商品的详情页原数据。因为是原数据&#xff0c;响应参数较多。 请求示例&#xff08;curl&#xff09;&#xff1a; -- 请求示例 url 默认请求参数已经URL编码处理 curl -i "https://api-服…

Java 在PDF中替换文字(详解)

目录 使用工具 Java在PDF中替换特定文字的所有实例 Java在PDF中替换特定文字的第一个实例 Java在PDF中使用正则表达式替换特定文字 其他替换条件设置 可能出现的问题及解决方案 PDF文档中的信息随时间的推移可能会发生变化&#xff0c;比如产品价格、联系方式等。为了确保…

2024可信数据库发展大会|存算分离架构驱动电信数据平台革新

7 月 16 日 - 17 日&#xff0c;由中国通信标准化协会和中国信息通信研究院主办&#xff0c;大数据技术标准推进委员会承办&#xff0c;InfoQ 联合主办的「2024 可信数据库发展大会」&#xff08;TDBC&#xff09;在北京召开。 酷克数据解决方案架构师吴昊受邀参与“电信行业数…

算法-计数质数

题目&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 思路&#xff1a; 使用埃式筛法 当n大于等于2时&#xff0c;如果当前遍历的数 i 是质数&#xff0c;那么从 i*i 开始&#xff0c;直到 n 为止&#xff0c;把 i 的倍数都标记为合数 代码&a…

python数据挖掘---机器学习模型

机器学习模型 数据 算法 算法 Clustering (聚类)&#xff0c;旨在将数据根据相似性进行分组&#xff0c;不需要事先知道每个组的具体定义或标签。简单地说就是把相似的东西分到一组&#xff08;簇&#xff09;&#xff0c;聚类的时候&#xff0c;我们并不关心某一类是什么&am…

为什么提示词写作技能会让生成式AI工程师更上一层楼?

欢迎来到云闪世界。 “为什么我的经理对我的文章吹毛求疵&#xff1f;把措辞从 X 改为 Y 有什么区别&#xff1f;” 当你看到你的经理在你的文档中提出了无数建议时&#xff0c;你可能发现自己有这样的想法&#xff1b;我知道我有过。事实上&#xff0c;我曾经认为写作是数据科…

29、js中this指向

this就是一个使用在作用域内的关键字 1.普通函数调用——》指向window function fn(){console.log(this) //Window } fn() 2.对象调用——》指向对象名 var obj {a: fn,};console.log(obj.a()); 3.定时器函数调用——》指向window setTimeout(function () {console.log(thi…