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

C++异常处理

C++异常处理

错误

明显的,比如代码不规范,编译错误、头文件引用错误、文件编码错误

异常

程序运行之后,由内存、硬盘、操作系统、网络出现的意外。

C语言怎么处理?

断言

assert判断指针不为空。条件不成立则abort终止程序

assert != NULL;

返回errno错误号

errno.h

dup:复制文件描述符,返回最小可用的新 fd

dup2:强制复制到指定的新 fd(常用作重定向)

int fp = open("a.txt",O_RDONLY); :打开文件,返回文件描述符(fd),失败返回-1

if (fp<2){perror("open");} :打开文件错误信息

int fp = open("a.txt",O_RDONLY); :打开文件,返回文件描述符(fd),失败返回-1

if (fp<2){char * err =strerr(errno);} :显示错误信息(string.h)

错误日志文件

int efd = open("error.log"); ----stderr文件号2

dup2(efd,2);

C++异常机制

简述异常机制

尝试捕获异常,并处理。 ---- try{...}catch(异常类型 对象名){...}

通过判断的方式,抛出异常

编写步骤

throw:抛出异常

语法:

throw 变量/对象/数据;

变量的数据类型 ----任意类型或类

对象的类型 ----任意类型或类

try:尝试捕获

语法:

try{可能存在异常的语句; }

catch:捕获并处理异常

语法:

catch(异常类型 对象/变量){处理异常语句; }

异常被处理之后,则不会向上抛出

void show(char* s) { //assert(s != NULL); if (s == NULL)throw"空指针异常"; s[0] = 'a'; cout << s<<endl; } int main() { cout << "--test error--" << endl; try {//尝试捕获异常 //show(const_cast<char*>("hi,disen!")); char* info = new char[32] {"good,disen!"}; show(info); show(nullptr); } catch(const char* err){ cerr << err << endl;//错误输出 } }

异常处理中的栈捕获(栈对象的解旋)

抛出异常对象时,临时对象存储到异常栈中。抛出异常对象是局部对象时,则执行拷贝构造,在异常栈中。

捕获到异常对象:从异常栈中查找到了。

如果是以非引用的方式,则会从异常栈中拷贝过来,异常处理完场之后,则会释放对象空间。

如果是以引用方式,引用的是栈中的异常对象,不会拷贝。

设计异常类的建议

具有派生体系时, 基类引用的捕获放在最后面。

class BaseException { private: string msg; public: BaseException(const string& msg) :msg(msg) {} virtual string error() { return msg; } }; class DivByZeroException :public BaseException { public: DivByZeroException():BaseException("除数为0"){} }; class NullPointException :public BaseException { public: NullPointException() :BaseException("空指针") {} }; class TimeoutException : public BaseException { private: int timeout; public: TimeoutException(int timeout) : BaseException("连接超时:"), timeout(timeout) {} string error()override { char buf[128] = ""; sprintf_s(buf, "%s %d", BaseException::error().c_str(), timeout); return string(buf); } }; void test1() { cout << "test1 throw NullPointExcepyion" << endl; throw NullPointException(); } void test2() { cout << "test2 throw TimeoutException" << endl; throw TimeoutException(100); } void test3() { cout << "test3 throw DivByZeroException" << endl; throw DivByZeroException(); } int main() { try { //test2(); test3(); } catch (NullPointException& e) {//异常类的基类引用,体现多态性 cout << "NullPointException&:" << e.error() << endl; } catch (TimeoutException& e) {//异常类的基类引用,体现多态性 cout <<"TimeoutException&:" << e.error() << endl; } catch (BaseException& e) {//异常类的基类引用,体现多态性 cout << "BaseException&:" << e.error() << endl; } return 0; }

C++异常体系

C++ 异常是树形继承体系,所有异常的最终基类只有一个:std::exception

整个体系分为两大分支:

  1. 逻辑错误:代码写错、参数错、前提不满足(程序可避免)
  2. 运行时错误 :运行时环境问题、外部资源失败(程序无法避免

bad_alloc:new 分配内存失败

bad_cast:dynamic_cast 转换失败

bad_typeid:typeid 空指针

bad_exception:异常抛出异常

C++11中的noexcept

关键字:noexcept

告诉编译器:这个函数绝对不会抛异常。

如果函数声明了 noexcept,内部却 throw 了,程序会直接终止,不会进入 catch,直接崩溃。

最佳应用位置

1.构造函数

2.拷贝构造

3.getter相关的成员函数

void test3(int v) noexcept{ //runtime_error运行时异常 //bad_exception错误的 if (v == -1)throw out_of_range("v下标越界"); }
http://www.jsqmd.com/news/718658/

相关文章:

  • 避坑指南:用STM32外部中断测速,为什么你的MH-Sensor数据总跳变?附滤波与防抖实战
  • 同一个问题-怎么回答都不对-你们怎么选-
  • Flipper Zero CAN总线扩展板:汽车电子诊断与安全研究工具
  • 告别JIT编译卡顿:用.NET 8.0 AOT编译你的第一个独立Web API(附完整配置流程)
  • 2026近期乐清周边编程机构推荐:本土信奥竞赛老品牌小橙编程 - 速递信息
  • 别再只会点‘开始扫描’了!Burp Scanner 从配置到报告生成的保姆级避坑指南
  • 域名销售必看 : 如何精准获客 ,高效成交
  • CentOS系统------DBMS
  • MedGemma-X临床实战:如何用AI辅助完成间质性肺病影像分析
  • 头铁美女甜菜欣欣-15岁独自润美国-从举目无亲到名校毕业
  • ArcGIS Pro vs ArcMap:一个真实项目的数据处理与三维可视化实战对比
  • agent skill实战:结构设计 + 故障排查实战
  • 怎样高效构建微信智能助手:完整实用手册
  • RTX 4090专属优化:yz-bijini-cosplay镜像性能与画质全解析
  • 零基础也能玩转3D!Deep3D让普通视频秒变立体大片
  • 面向高可靠与快速响应需求的高端报警系统功率MOSFET选型策略与器件适配手册
  • 从“定比分点”到“交比不变”:用初中三角形面积公式,轻松理解射影几何的核心定理
  • 马斯克五步法实战:用Notion和飞书搭建你的个人效率系统(附模板)
  • 如何快速配置Boss-Key:Windows隐私保护的终极指南
  • AI剧本杀对局全流程界面设计报告
  • 2026年知网AIGC检测升级后80%标红?必看三招自救指南,最后一招太香了! - 降AI实验室
  • Windows 10系统精简终极指南:如何用开源工具让你的电脑快如闪电?
  • 【nanobot】 实战与二次开发:4000 行代码,一套完整的 【AI Agent】 框架
  • 3分钟搞定GitHub加速:告别龟速下载,让代码飞起来!
  • 番茄小说下载器:打造你的私人数字图书馆,告别网络依赖
  • 终极指南:如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题
  • STM32H743+SOEM+英威腾DA200伺服:一个嵌入式EtherCAT主站的完整调试笔记(含代码)
  • nthinlink用的.net版本
  • 2025_NIPS_iVideoGPT: Interactive VideoGPTs are Scalable World Models
  • 盘点全球四大海底光缆,数字孪生赋能运维巡检