zoukankan      html  css  js  c++  java
  • c++ try throw catch

    c++ try throw catch

    这三者联合使用 ,

    1. try {
    2.     statement list;
    3.     }
    4.     catch( typeA arg ) {
    5.     statement list;
    6.     }
    7.     catch( typeB arg ) {
    8.     statement list;
    9.     }
    10.     ...
    11.     catch( typeN arg ) {
    12.     statement list;
    13.     }
    throw放在try中,如果throw执行了,也有相应的catch,就能捕获到相应的值。例子如下
    1. #include <exception>
    2. #include <stdexcept>
    3. #include <iostream>
    4. using namespace std;
    5. struct argument_error : public std::runtime_error
    6. {
    7.         argument_error(const std::string& s): std::runtime_error(s) { }
    8. };
    9. int main(int argc)
    10. {
    11.         std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
    12.         try{
    13.                 if (argc > 5)
    14.                 throw argument_error("argc is greater than 5!");
    15.         else
    16.                 throw argc;
    17.         }
    18.         catch (argument_error e){
    19.                 cout << "argc: others"<< endl;
    20.         }
    21.         catch (int e){
    22.                 cout << "argc:" << e << endl;
    23.         }
    24. }
     
    参考文章
    ==============================
    c++ try_catch
     
    1、基础介绍
    try
    {
    //程序中抛出异常
    throw value;
    }
    catch(valuetype v)
    {
    //例外处理程序段
    }
    语法小结:throw抛出值,catch接受,当然,throw必须在“try语句块”中才有效。

    2、深入throw:
    (i)、程序接受到throw语句后就会自动调用析构器,把该域(try后的括号内)对象clean up,然后再进
    入catch语句(如果在循环体中就退出循环)。

    这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时(又是指针!),在 “类的构建器
    ”中的throw语句引起的退出,会导致这个指针所指向的对象没有被析构。这里很基础,就不深入了,提
    示一下,把指针改为类就行了,比如模板类来代替指针,在模板类的内部设置一个析构函数。

    (ii)、语句“throw;”抛出一个无法被捕获的异常,即使是catch(...)也不能捕捉到,这时进入终止函数
    ,见下catch。

    3、深入catch:
    一般的catch出现的形式是:
    try{}
    catch(except1&){}
    catch(except2&){}
    catch(...){} //接受所有异常
    一般都写成引用(except1&),原因很简单,效率。

    问题a:抛出异常,但是catch不到异常怎么办?(注意没有java类似的finally语句)
    在catch没有捕获到匹配的异常的时候,会调用默认的终止函数。可以调用set_terminate()来设置终止函数,参数是一个函数指针,类型是:void (*terminate)()。

    到这里,可以题个问题:“没有try-catch,直接在程序中"throw;",会怎么样?”


    其他一些技巧:
    4、try一个函数体,形式如下
    void fun(type1,type2) try----try放在函数体后
    {
       函数定义
    }
    catch(typeX){}
    这个用法的效果就相当于:
    void fun()
    {
       try{函数定义}
    }


    5、throw一个函数体,形式如下:
    void fun (); // 能抛出任何类型的异常
    void fun () throw(except1,except2,except3)
                   // 后面括号里面是一个异常参数表,本例中只能抛出这3中异常
    void fun () throw()   // 参数表为空,不能抛出异常

    问题b:假设fun()中抛出了一个不在“异常参数表”中的异常,会怎么样?

    答: 调用set_terminate()中设定的终止函数。然而,这只是表面现象,实际上是调用默认的unexpected()函数,然而这个默认的 unexpected()调用了set_terminate()中设定的终止函数。可以用set_unexpected()来设置unexpected, 就像set_terminate()一样的用法,但是在设定了新的“unexpected()”之后,就不会再调用set_terminater中设定的 终止函数了。

    这个语法是很有用的,因为在用别人的代码时,不知道哪个地方会调用什么函数又会抛出什么异常,用一个异常参数表在申明时限制一下,很实用。
    ===============================
     
     
    参考
    1. http://laokaddk.blog.51cto.com/368606/214051
    2. http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html
    3. cppreference
  • 相关阅读:
    nginx安装
    虚拟机下Linux的NAT网络配置 及显示红叉
    eclipse常用快捷键
    MongoDB笔记
    Pytorch 之 MNIST 数据集实现(代码讲解)
    [python][科学计算][matplotlib]使用指南
    梯度计算
    第一次神经网络作业,神经网络预测图片是否为猫的代码实现
    KVM监控完善
    Zabbix表结构,zabbix api获取主机信息vs直接从数据库获取主机信息
  • 原文地址:https://www.cnblogs.com/timssd/p/4781112.html
Copyright © 2011-2022 走看看