• C++异常处理


    一、异常使用

    C++可以配合使用try、throw和catch来实现异常的处理。即在try确定的“保护代码”内,使用throw抛出异常,并用catch捕获异常。用一段代码来说明:

    #include <iostream>
    using namespace std;
     
    double division(int a, int b)
    {
       if( b == 0 )
       {
          throw "Division by zero condition!";
       }
       return (a/b);
    }
     
    int main ()
    {
       int x = 50;
       int y = 0;
       double z = 0;
     
       try {
         z = division(x, y);
         cout << z << endl;
       }catch (const char* msg) {
         cerr << msg << endl;
       }
     
       return 0;
    }

    上述代码不会执行return (a / b);而是在判断b==0后,抛出一个const char*类型的异常,并被catch捕获,并打印出。

    二、标准异常和定义新异常

    C++中还可以通过继承 exception 类定义新的异常,以一段代码来说明:

    #include <iostream>
    #include <exception>
    using namespace std;
    
    struct MyException : public exception
    {
        const char * what() const throw ()
        {
            return "C++ Exception";
        }
    };
    
    int main()
    {
        try
        {
            throw MyException();
        }
        catch (MyException& e)
        {
            std::cout << "MyException caught" << std::endl;
            std::cout << e.what() << std::endl;
        }
        catch (std::exception& e)
        {
            //其他的错误
        }
    
        system("pause");
    }

    上述代码中:

    1)what()重载了exception类的what方法,用户自定义了其实现,即打印出“C++ Exception”。what()的返回值是 C 风格字符串(即 const char *)。除了通过继承exception定义新的异常外,C++还有一系列标准异常,如runtime_error,它就含有what()方法:

    while (cin >> item1 >> item2){
      try{
        //执行添加两个Sales_item对象的代码
        //如果添加失败,代码抛出一个runtime_error异常
      } catch (runtime_error err){
          //提醒用户两个ISBN必须一致,询问是否重新输入
          cout << err.what()
               << "
    Try Again? Enter y or n" << endl;
          char c;
          cin >> c;
          İf (!cin || c == 'n')
              break;//跳出while循环
        }
    }

    2)const char * what() const throw ()中的const throw()不是函数,这个叫异常规格说明,它表示what()可以跑出的异常的类型,()为空。表示what本身不抛出异常。

    3)各种标准异常

    异常描述
    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::out_of_range 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。
    std::runtime_error 理论上不可以通过读取代码来检测到的异常。
    std::overflow_error 当发生数学上溢时,会抛出该异常。
    std::range_error 当尝试存储超出范围的值时,会抛出该异常。
    std::underflow_error 当发生数学下溢时,会抛出该异常。
  • 相关阅读:
    Android系统源代码下载
    Windows Embedded Compact 7初体验
    windowsmobile 开发环境
    Windows X64汇编入门(1)
    汇编语言的Hello World
    如何构建Win32汇编的编程环境(ONEPROBLEM个人推荐)
    音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw
    汇编开发环境
    DirectX
    关于DirectShow SDK 和Windows SDK,及DirectX SDK
  • 原文地址:https://www.cnblogs.com/zeppelin5/p/10138883.html
Copyright © 2020-2023  润新知