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

c++ try throw catch的更多相关文章

  1. C++中的try throw catch 异常处理

    今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,ca ...

  2. try throw catch

    #include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace st ...

  3. try throw catch异常处理机制

    /*本程序实现分块查找算法  又称索引顺序查找     需要注意的是分块查找需要2次查找  先对块查找  再对块内查找    2013.12.16    18:44*/ #include <io ...

  4. try throw catch typeid

    QString str = ui.ll->text(); try { if (str == NULL) { throw 1; } else { throw 1.2; } } catch (int ...

  5. 132.try throw catch介绍

    #include <iostream> using namespace std; //try尝试执行,抛出throw,throw之后语句不再执行 //catch处理throw的异常 voi ...

  6. C#中try catch中throw ex和throw方式抛出异常有何不同

    我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...

  7. 【又长见识了】C#异常处理,try、catch、finally、throw

    异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常.处理这种错误,就叫做异常处理. 1.轻描淡写Try.Catch.Finally.throw用法 在异常处理中,首先需要对可能发 ...

  8. C++的异常处理之一:throw是个一无是处的东西

    看这篇文章学习C++异常处理的基础知识.看完后,还不过瘾,为什么大家在C++代码中都不用Exception?为什么C++11会引入一些变化? 为什么C++ exception handling需要un ...

  9. [转] c++ try catch 问题

    windhaunting,原文地址 以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: ...

随机推荐

  1. Android实现异步处理 -- HTTP请求

    原帖:http://www.cnblogs.com/answer1991/archive/2012/04/22/2464524.html Android操作UI的方法不是线程安全的,也就是说开发者自己 ...

  2. Android中的单元测试

    2015年5月19日 23:10     在Android中,已经内置了Junit所以不需要在导包.只要继承AndroidTestCase类就可以了.     首先需要修改AndroidManifes ...

  3. C#反射 入门学习 01

    前言     获取方法的相关信息的两种形式 反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象: 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法 ...

  4. Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)

    Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...

  5. mysql 监控 大批量的插入,删除,和修改

    监控大批量的插入,修改和删除: mysql> insert into aaa select * from aaa; mysql> SELECT trx_id, trx_state, trx ...

  6. Android_Service组件详解

    1.Service概述 Service服务是一个没有用户界面的在后台运行执行操作的应用组件,其它组件可以通过Intent意图启动这个Service去完成特定的功能,比如通过Service可以完成播放音 ...

  7. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  8. 【linux kernel】 中断处理-中断下半部

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  9. 使用ItextSharp产PDF完整操作

    原文 使用ItextSharp产PDF完整操作 记得上回有写到用C#操作Excel(.net 4.0) 很多朋友说推荐用NPOI,的确,用微软自带的操作execl会有很大的问题.客户的主机不愿意安装e ...

  10. js中使用jstl中得到的值

    jstl的标签会转化为服务器端的代码执行,而js代码则在客户端执行.        要在js中使用jstl并不是直接将jstl的value赋值给一个js的变量,而是要在jstl的value上加上&qu ...