[C.C++] C++异常处理

95 0
Honkers 8 小时前 来自手机 | 显示全部楼层 |阅读模式

(一)异常处理定义

异常是程序在执行期间产生的问题,任何事物,任何情况都可以当做异常,错误算是异常的一种 。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

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

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

 标准库中的异常:

 

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

(二)异常处理基操

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

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

捕获处理异常:catch在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。

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

 基本语法格式:try { // 保护代码 }catch(...) { // 能处理任何异常的代码 }

  如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。

 相关代码:

  1. #include <iostream>
  2. using namespace std;
  3. int Div(int a, int b)
  4. {
  5. //正常写程序 有问题立刻处理
  6. //if (b == 0)
  7. //{
  8. // cout << "除数不能为0" << endl;
  9. // return 0;
  10. //}
  11. if (b == 0)
  12. throw 0; //
  13. return a / b;
  14. }
  15. int main()
  16. {
  17. //Div(1, 0); //调用abort函数终止程序
  18. try
  19. {
  20. cout << "测试.....1" << endl;
  21. Div(1, 0);
  22. cout << "测试.....2" << endl;
  23. }
  24. catch (double)
  25. {
  26. cout << "double:除数不能为零" << endl;
  27. }
  28. catch (int) //捕获int类型异常
  29. {
  30. cout << "int:除数不能为零" << endl;
  31. }
  32. //error C2312: “int”: 由“int”在行 28 上捕获,不能写两个相同的
  33. //catch (int)
  34. //{
  35. //cout << "int:除数不能为零" << endl;
  36. //}
  37. return 0;
  38. }
复制代码

(三) C++ 标准的异常

C++ 提供了一系列标准的异常,定义在  中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:

下表是对上面层次结构中出现的每个异常的说明: 

异常描述
std::exception该异常是所有标准 C++ 异常的父类。
std::bad_alloc该异常可以通过 new 抛出。
std::bad_cast该异常可以通过 dynamic_cast 抛出。
std::bad_exception这在处理 C++ 程序中无法预期的异常时非常有用。
std::bad_typeid该异常可以通过 typeid 抛出。
std::logic_error理论上可以通过读取代码来检测到的异常。
std::domain_error当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument当使用了无效的参数时,会抛出该异常。
std::length_error当创建了太长的 std::string 时,会抛出该异常。
std:ut_of_range该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>:perator[]()。
std::runtime_error理论上不可以通过读取代码来检测到的异常。
std:verflow_error当发生数学上溢时,会抛出该异常。
std::range_error当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error当发生数学下溢时,会抛出该异常。

exception类组成:

  • what方法 用来返回异常信息的字符串

       相关代码:

  1. #include <iostream>
  2. #include <exception>
  3. using namespace std;
  4. class Error :public exception
  5. {
  6. public:
  7. //virtual char const* what() const
  8. //{
  9. // return "Error";
  10. //}
  11. Error() :exception("Error") {}
  12. private:
  13. };
  14. void printTest()
  15. {
  16. throw Error();
  17. }
  18. int main()
  19. {
  20. try
  21. {
  22. printTest();
  23. }
  24. catch (Error& object)
  25. {
  26. cout << object.what() << endl;
  27. }
  28. return 0;
  29. }
复制代码

(四)异常处理的小技巧

  1. 局部控制能处理的问题,不需要异常机制

  2. 千万不要在析构函数抛出异常(作死操作)

  3. 构造函数存在问题,也不要次啊用异常机制

  4. 自己写异常类 没必要都是继承exception,可以适当根据具体问题,继承相应子类即可

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

特级红客

关注
  • 3238
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行