C++异常处理机制

本文介绍了C++异常处理机制,包括概念、语法、异常安全、规范和优缺点。异常处理提供了一种在函数调用链中优雅地处理错误的方式,允许程序在遇到错误时继续执行,而非立即终止。然而,不恰当的异常使用可能导致资源泄漏和调试困难。建议遵循异常规范,自定义异常体系,以提高代码的可维护性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言传统处错误的方式

  • 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。
  • 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误
  • C 标准库中setjmplongjmp组合。这个不是很常用,可以了解一下
    实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
    鉴于上述的错误处理机制对程序员来说不是很友好,于是C++中就引入了异常处理机制

C++异常的概念

异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接间接调用者处理这个错误。并且让程序继续执行下去而不是立即终止程序。
这里可以举一个例子
直接处理:例如函数A中突然出现了除以0的异常错误,而我在函数A中去捕获这个异常,并且去处理了这个异常,从而使得程序能够继续运行下去。
间接处理:例如函数A中出现了某个异常,而我并没有在函数A中去处理这个异常,而是来到调用函数A的函数B中,如果函数B没有处理这个异常,那么继续向上一层的函数调用者返回,以此类推,最终,如果向上层返回给了main函数,那么main函数就必须处理这个异常,如果main函数不处理这个异常,那么程序一样会因为异常而立即终止。

C++异常处理的语法

  • 当问题出现时,程序会抛出一个异常。这时,通过throw关键字来完成的
    表达式的值可以是基本类型,也可以是类
throw 表达式//表达式的值可以是基本类型,也可以是类
  • 当问题已经出现,那么我想要在我想处理问题得地方,通过异常处理程序捕获这个异常,就需要catch关键字来捕获异常,并且可以有多个catch来进行捕获

  • try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch块

try{
   
	被保护的代码
}
catch(捕获的异常1){
   
	异常处理代码
}
catch(捕获的异常2){
   
	异常处理代码
}
...
catch(捕获的异常n){
   
	异常处理代码
}

示例
假定test函数中出现a-b小于0的异常,那么我抛出一个int类型的异常,这时,下面测catch块中就会捕获对应类型的异常。

#include<iostream>
using namespace std;
void test()
{
   
  try{
   
    double a = 2.0,b = 3.0;
    if(a - b < 0){
   
      throw -1;
    }
  }
  catch(int){
   
    cout<<"catch int"<<endl;
  }
  catch(char){
   
    cout<<"catch char"<<endl;
  }
  cout<<"test finished"<<endl;
}
int main()
{
   
  test();
  cout<<"in main()"<<endl;
  return 0;
}

运行结果如下,可以看出出现异常了,处理异常后使得程序继续执行直到结束
在这里插入图片描述
再看间接异常的处理

#include<iostream>
using namespace std;
void test(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值