11. C++异常处理

简介: 11. C++异常处理

什么是异常处理

异常: 任何事物,任何情况都可以当做异常,错误算是异常的一种

异常处理机制: 暂时性不做处理,抛出异常,留给使用者去处理

注意问题:  所有抛出的异常,必须要处理,如果不做处理,引发异常识,程序调用abort函数终止程序

异常处理基操

抛出异常: throw   抛出的东西一定一个值

检查异常:try

捕获处理异常:catch

注意点: try和catch必须一起出现,并且各自的{}不能省略

#include <iostream>
using namespace std;
int Div(int a, int b) 
{
  //正常写程序 有问题立刻处理
  //if (b == 0) 
  //{
  //  cout << "除数不能为0" << endl;
  //  return 0;
  //}
  if (b == 0)
    throw 0;      
  return a / b;
}
int main() 
{
  //Div(1, 0);   //调用abort函数终止程序
  try 
  {
    cout << "测试.....1" << endl;
    Div(1, 0);
    cout << "测试.....2" << endl;
  }
  catch (double)     //捕获int类型异常    
  {
    cout << "double:除数不能为零" << endl;
  }
  catch (int) 
  {
    cout << "int:除数不能为零" << endl;
  }
  //error C2312: “int”: 由“int”在行 28 上捕获
  //catch (int)
  //{
    //cout << "int:除数不能为零" << endl;
  //}
  return 0;
}

没有异常

老版本:  throw () 放在函数后面

新标准: noexcept放在函数后面修饰

//老版本 
int Max(int a, int b) throw() 
{
  return a > b ? a : b;
}
//新标准
int Sum(int a, int b) noexcept
{
  return a + b;
}

异常处理的传参操作

#include <iostream>
using namespace std;
void printArray(int array[], int arrayNum) 
{
  if (arrayNum < 1)
    throw 1;
  cout << "正常长度,假装打印...." << endl;
}
void searchArray(int array[], int arrayNum)
{
  if (arrayNum < 1)
    throw 2;
  cout << "正常长度,假装查找...." << endl;
}
void deleteArray(int array[], int arrayNum)
{
  if (arrayNum < 1)
    throw 3;
  cout << "正常长度,假装删除...." << endl;
}
int Div(int a, int b) 
{
  if (b == 0)
    throw string("除数不能为零");
  return a / b;
}
//抛出自己类对象:自定义异常类
class stackEmpty 
{
public:
  stackEmpty(string strInfo) :strinfo(strInfo) {}
  void print() 
  {
    cout << "error:" << strinfo << endl;
  }
private:
  string strinfo;
};
//假装入栈
void push(int a) 
{
  if (a == 0)
    throw stackEmpty("栈为空");
  cout << a << endl;
}
int main()
{
  try
  {
    int array[3] = { 1,2,3 };
    printArray(array, 3);
    searchArray(array, -1);
    deleteArray(array, 2);
  }
  catch (int value)     //int value=抛出的值 
  {
    switch (value)
    {
    case 1:
      cout << "打印异常" << endl;
      break;
    case 2:
      cout << "查找异常" << endl;
      break;
    case 3:
      cout << "删除异常" << endl;
      break;
    }
  }
  try
  {
    cout << Div(2, 1) << endl;
    cout << Div(2, 0) << endl;
  }
  catch (string& object)
  {
    cout << object << endl;
  }
  //... 表示可以捕获任何异常
  try
  {
    cout << Div(2, 0) << endl;
  }
  catch (...)                      //删减符
  {
    cout << "引发异常" << endl;
  }
  try 
  {
    push(1233);
    push(0);
  }
  catch (stackEmpty& object) 
  {
    object.print();
  }
  return 0;
}

标准库中的异常

标准库中异常

exception类组成:

  • what方法 用来返回异常信息的字符串
#include <exception>
#include <iostream>
using namespace std;
class Error :public exception 
{
public:
    //virtual char const* what() const
    //{
    //    return "Error";
    //}
    Error() :exception("Error") {}
private:
};
void  printTest() 
{
    throw Error();
}
int main() 
{
    try 
    {
        printTest();
    }
    catch (Error& object) 
    {
        cout << object.what() << endl;
    }
  return 0;
}

引发ball_alloc异常

#include <exception>
#include <iostream>
using namespace std;
int main() 
{
  int array[3] = { 1,2,3 };
  try 
  {
    while (1)
    {
      int* p = new int[1024 * 1024];
    }
  }
  catch (bad_alloc& object) 
  {
    cout << object.what() << endl;
  }
  return 0;
}

异常处理的建议

  1. 局部控制能处理的问题,不需要异常机制
  2. 千万不要在析构函数抛出异常(作死操作)
  3. 构造函数存在问题,也不要次啊用异常机制
  4. 自己写异常类 没必要都是继承exception,可以适当根据具体问题,继承相应子类即可
目录
相关文章
|
3月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
74 2
|
6月前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(一)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
92 1
|
6月前
|
安全 C++
C++中的异常处理与错误处理机制
C++中的异常处理与错误处理机制
72 0
|
5月前
|
C++
C++一分钟之—异常处理try-catch
【6月更文挑战第22天】C++异常处理机制,借助`try`、`catch`、`throw`管理错误,优雅处理异常,防止程序崩溃。`try`包围可能出错的代码,`catch`捕获异常,`throw`引发异常。基本结构是:`try-catch`块中,未捕获的异常将向上抛出。多`catch`块可按顺序捕获不同类型的异常。易错点包括忽视异常传播、不精确的`catch`和资源未清理。通过精确捕获、RAII技术和适当的异常策略,提升代码健壮性和效率。
40 1
|
5月前
|
C++
C++核心技术要点《异常处理详解》
C++核心技术要点《try-throw-catch异常处理详解》
50 2
|
5月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
47 0
|
6月前
|
程序员 编译器 C++
C++中的异常处理:技术详解与实践
C++中的异常处理:技术详解与实践
110 1
|
5月前
|
C++
C++对C的改进和拓展\异常处理
C++对C的改进和拓展\异常处理
35 0
|
6月前
|
C++
C++程序异常处理
C++程序异常处理
41 1
|
5月前
|
C++
Essential C++ 第7章 异常处理
Essential C++ 第7章 异常处理