zoukankan      html  css  js  c++  java
  • C++之异常捕获和处理

    一、简介

      在C++语言中,异常处理包括:throw表达式try语句块一套异常类。其中,异常类用于在throw表达式和相关的catch子句之间传递异常的具体信息。exception头文件定义了最普通的异常类exception,它只报告异常的发生,不提供任何额外信息。以下是定义在stdexcept头文件中的常用的异常类:

    异常类 解释
    exception 最常见的问题
    runtime_error 只有在运行时才能检测出的问题
    range_error 运行时错误:生成的结果超出了有意义的值域范围
    overflow_error 运行时错误:计算上溢
    underflow_error 运行时错误:计算下溢
    logic_error 程序逻辑错误
    domain_error 逻辑错误:参数对应的结果值不存在
    invalid_argument 逻辑错误:参数无效
    length_error 逻辑错误:试图创建一个超过该类型最大长度的对象
    out_of_range 逻辑错误:使用一个超出有效范围的值

      异常类只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。

    二、基本用法

      直接贴代码,简单测试一下:

    #include <stdexcept>
    #include <iostream>
    
    using namespace std;
    
    void test() {
        throw runtime_error("just for test!");
    }
    
    int main() {
        try {
            test();
        } catch(runtime_error err) {
            cout << err.what() << endl;
        }
        return 0;
    }
    
    /*
    * 执行的结果不出意料,便是:just for test!
    * 可以有多个catch语句块
    * 找到了匹配的runtime_error便执行相应的catch语句块代码
    */
    

    注意:当执行一个throw时,跟在throw后面的语句将不再被执行。且只有在catch语句块中可以使用throw;这样的语句,表示当前的catch语句不足与完整地处理好这个异常,于是决定由更上一层的函数接着处理。

    三、noexcept

      概括来说,这个关键字有两种用法:作为函数限定符,作为一个一元运算符返回一个bool类型的右值常量表达式。

      第一个用法中,noexcept放在函数的后面,一般而言,对于成员函数来说,放在const后面,而放在final、override或虚函数的=0之前。其表示该函数不会抛出异常,但如下情况也可以顺利编译:

    void f() noexcept {
        throw exception();
    }
    

      需要注意的是,函数指针及该函数指向的函数必须具有一致性的异常说明,如下:

    void (*pf1)(int) noexcept;
    
    void f() noexcept {}
    void t() {}
    
    pf1 = f; //正确,因为f能保证不抛出异常
    pfi = t; //错误,因为t不能保证
    

      第二个用法中,可以如下使用:

    noexcept(f()) //若f保证不抛出异常,则返回true
    
    //一个常用用法,等价于void t() {}
    void t() noexcept(false) {}
    
    //以下保证f和g的异常类型一致
    void f() noexcept(noexcept(g()));
    

    四、定义自己的异常类

      假设你想设计一个异常类,名为test_error,其的效果和runtime_error一样,可以用如下代码:

    class test_error : public runtime_error {
    public:
        explicit test_error(const string &s):
                        runtime_error(s) {}
    };
    
  • 相关阅读:
    Microsoft .NET Framework 远程执行代码漏洞
    GE PACSystems RX3i 输入验证漏洞
    Windows10 1809版本Windows自动更新服务无法禁用问题解决方案
    企业网络防范Serv-U的漏洞
    jsp安全问题及其解决建议
    Windows XP系统搜索故障及处理办法点点通
    开启路由器的TCP拦截
    从MyIE2平滑升级到Maxthon的完美方案
    全面解析UNIX缓冲区溢出 深度防御体系
    从异常系统进程检查企业网络安全 (二)
  • 原文地址:https://www.cnblogs.com/vachester/p/7599422.html
Copyright © 2011-2022 走看看