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,可以适当根据具体问题,继承相应子类即可
目录
相关文章
|
21天前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(一)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
41 1
|
4天前
|
安全 C++
C++中的异常处理与错误处理机制
C++中的异常处理与错误处理机制
17 0
|
11天前
|
程序员 编译器 C++
C++中的异常处理:技术详解与实践
C++中的异常处理:技术详解与实践
|
15天前
|
C++
C++程序异常处理
C++程序异常处理
22 1
|
21天前
|
NoSQL 测试技术 C++
C++的异常处理及错误调试技巧
C++的异常处理及错误调试技巧
15 0
|
21天前
|
存储 C++
C++ 异常处理机制详解:轻松掌握异常处理技巧
C++ 异常处理提供结构化错误管理,增强程序健壮性。通过`throw`抛出异常,`try-catch`捕获并处理。示例展示了当年龄小于18时抛出异常。优点包括提高健壮性和代码可维护性,但可能降低性能并复杂化代码。另外,介绍了四种在C++中相加两个数的方法,包括使用运算符、函数、类、STL函数和lambda表达式。
24 0
|
21天前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
|
21天前
|
程序员 编译器 C语言
【C++高阶(七)】C++异常处理的方式
【C++高阶(七)】C++异常处理的方式
|
21天前
|
C++
C++语言异常处理学习应用案例
C++异常处理保证程序在运行时遇到错误(如除数为0)时不崩溃。以下是一个示例:程序接收用户输入的两个整数并进行除法运算。若除数为0,则抛出`std::runtime_error`异常。`try-catch`结构用来捕获并处理异常,当出现异常时,输出错误信息,使程序能继续执行。
20 4
|
21天前
|
C++
C++异常处理try和throw以及catch的使用
C++异常处理try和throw以及catch的使用