C++高级编程(二)异常 曾经终败给现在 2022-06-05 09:26 131阅读 0赞 C++中有<exception>标准异常库,其中exception是基类,标准库所生成的所有异常继承自std::exception。 class exception { public: exception () noexcept; exception (const exception&) noexcept; exception& operator= (const exception&) noexcept; virtual ~exception(); virtual const char* what() const noexcept;//(在各个派生类中实现) } 父子类继承关系: ![20171123162653944][] <table style="border:0px; margin:4px 0px; padding:0px; border-collapse:collapse; width:691px; color:rgb(51,51,51); font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC","WenQuanYi Micro Hei",Arial,sans-serif; font-size:12px"> <tbody style="border:0px; margin:0px; padding:0px"> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <th style="border:1px solid rgb(85,85,85); margin:0px; padding:3px; color:rgb(255,255,255); background-color:rgb(85,85,85); vertical-align:top; text-align:left"> 异常</th> <th style="border:1px solid rgb(85,85,85); margin:0px; padding:3px; color:rgb(255,255,255); background-color:rgb(85,85,85); vertical-align:top; text-align:left"> 描述</th> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> <strong>std::exception</strong></td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 该异常是所有标准 C++ 异常的父类。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::bad_alloc</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 该异常可以通过 <strong>new</strong> 抛出。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::bad_cast</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 该异常可以通过 <strong>dynamic_cast</strong> 抛出。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::bad_exception</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 这在处理 C++ 程序中无法预期的异常时非常有用。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::bad_typeid</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 该异常可以通过 <strong>typeid</strong> 抛出。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> <strong>std::logic_error</strong></td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 理论上可以通过读取代码来检测到的异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::domain_error</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当使用了一个无效的数学域时,会抛出该异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::invalid_argument</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当使用了无效的参数时,会抛出该异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::length_error</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当创建了太长的 std::string 时,会抛出该异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::out_of_range</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> <strong>std::runtime_error</strong></td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 理论上不可以通过读取代码来检测到的异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::overflow_error</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当发生数学上溢时,会抛出该异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::range_error</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当尝试存储超出范围的值时,会抛出该异常。</td> </tr> <tr style="border:0px; margin:0px; padding:0px; background-color:rgb(246,244,240)"> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; min-width:24px; line-height:2em; vertical-align:top"> std::underflow_error</td> <td style="border:1px solid rgb(212,212,212); margin:0px; padding:7px 5px; font-size:13px; line-height:2em; min-width:24px; vertical-align:top"> 当发生数学下溢时,会抛出该异常。</td> </tr> </tbody> </table> 异常是程序在执行期间产生的问题。异常提供了一种转移程序控制权的方式。 C++ 异常处理涉及到三个关键字:try、catch、throw。 * **throw:** 当问题出现时,程序会抛出一个异常。这是通过使用 **throw** 关键字来完成的。 * **catch:** 在您想要处理问题的地方,通过异常处理程序捕获异常。**catch** 关键字用于捕获异常。 * ** try: try** 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。 简单异常处理示例: #include<iostream> using namespace std; void Div(int a, int b) { if (b == 0) throw "Division by zero condition!"; else { cout <<"a/b="<< a / b << endl; } } int main() { int a = 5, b = 0; try{ //try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。 Div(a, b); } catch (const char* a) { cout << a << endl; } system("pause"); return 0; } 一个try块可以匹配多个catch语句。根据抛出throw类型,catch(type object)匹配对应的类型。 catch 块能够处理try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,catch(...)\{\} 定义新的异常类: #include<iostream> #include<exception> using namespace std; class Myexception :public exception //继承 { public : const char* what()const throw() //what实现 { return "Test Myexception!"; } }; int main() { try{ throw Myexception();//抛出构造函数(?) } catch (Myexception& e) { cout << e.what() << endl; } system("pause"); return 0; } **const throw()** ** 不是函数**,这个东西叫 异常规格说明 , 表示 **what** 函数可以抛出异常的类型 , 类型说明放到 **()** 里 ,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出 任何类型的异常 。 异常规格说明 1、异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。 可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如: void fun() throw(A,B,C,D); 2、若无异常接口声明,则此函数可以抛掷任何类型的异常。 3、不抛掷任何类型异常的函数声明如下: #include<iostream> #include<exception> using namespace std; class Myexception { public : Myexception(const char*message) :message_(message) { cout << message<< endl; } const char*what()const { return message_.c_str(); } virtual ~Myexception() { cout << "~MyException ..." << endl; } private: string message_; }; void fun(int n)throw(int, Myexception) { if (n == 1) { throw 1; } else if (n == 2) { throw Myexception("test exception"); } } int main() { try{ fun(2); } catch (int n) { cout << n << endl; } catch (Myexception&a) { cout << a.what() << endl; } system("pause"); return 0; } 参考: http://www.runoob.com/cplusplus/cpp-exceptions-handling.html [20171123162653944]: /images/20220605/6dcf002046ce454282db6dfcb6d67199.png
还没有评论,来说两句吧...