每羊杨

https://github.com/Zeppelin5 (Kinfu讨论群:563741937)

导航

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()
           << "\nTry 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 当发生数学下溢时,会抛出该异常。

posted on 2018-12-18 18:12  每羊杨  阅读(303)  评论(0编辑  收藏  举报