c++ try throw catch
这三者联合使用 ,
- try {
- statement list;
- }
- catch( typeA arg ) {
- statement list;
- }
- catch( typeB arg ) {
- statement list;
- }
- ...
- catch( typeN arg ) {
- statement list;
- }
- #include <exception>
- #include <stdexcept>
- #include <iostream>
- using namespace std;
- struct argument_error : public std::runtime_error
- {
- argument_error(const std::string& s): std::runtime_error(s) { }
- };
- int main(int argc)
- {
- std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
- try{
- if (argc > 5)
- throw argument_error("argc is greater than 5!");
- else
- throw argc;
- }
- catch (argument_error e){
- cout << "argc: others"<< endl;
- }
- catch (int e){
- cout << "argc:" << e << endl;
- }
- }
参考文章==============================c++ try_catch1、基础介绍
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中设定的
终止函数了。这个语法是很有用的,因为在用别人的代码时,不知道哪个地方会调用什么函数又会抛出什么异常,用一个异常参数表在申明时限制一下,很实用。
===============================
- http://laokaddk.blog.51cto.com/368606/214051
- http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html
- cppreference
c++ try throw catch的更多相关文章
- C++中的try throw catch 异常处理
今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,ca ...
- try throw catch
#include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace st ...
- try throw catch异常处理机制
/*本程序实现分块查找算法 又称索引顺序查找 需要注意的是分块查找需要2次查找 先对块查找 再对块内查找 2013.12.16 18:44*/ #include <io ...
- try throw catch typeid
QString str = ui.ll->text(); try { if (str == NULL) { throw 1; } else { throw 1.2; } } catch (int ...
- 132.try throw catch介绍
#include <iostream> using namespace std; //try尝试执行,抛出throw,throw之后语句不再执行 //catch处理throw的异常 voi ...
- C#中try catch中throw ex和throw方式抛出异常有何不同
我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...
- 【又长见识了】C#异常处理,try、catch、finally、throw
异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常.处理这种错误,就叫做异常处理. 1.轻描淡写Try.Catch.Finally.throw用法 在异常处理中,首先需要对可能发 ...
- C++的异常处理之一:throw是个一无是处的东西
看这篇文章学习C++异常处理的基础知识.看完后,还不过瘾,为什么大家在C++代码中都不用Exception?为什么C++11会引入一些变化? 为什么C++ exception handling需要un ...
- [转] c++ try catch 问题
windhaunting,原文地址 以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: ...
随机推荐
- 最简单也最难——如何获取到Android控件的高度
问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...
- sql2008R2sp1局域网镜像环境实操(无见证服务器)
环境介绍: 我的电脑:sql2008r2sp1_32 129.186.110.37 OS win2003 SP2 Enterprise 做主体服务器, 暂叫ServerA 服务器: sq ...
- EXT.NET高效开发(三)——使用Chrome浏览器的开发人员工具
这篇帖子老少皆宜,不分男女,不分种族,不分职业.俗话说:“磨刀不误砍柴工”.掌握一些开发工具的使用,对自己帮助是很大的(无论是用于分析问题,还是提高生产力).本篇就讲述如何利用Chrome浏览器(这里 ...
- Eclipse生成Jar包方法
Eclipse生成jar包 第一:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Exp ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格
原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...
- c 中关于int,unsigned int , short 各种类型总结
int类型比较特殊,具体的字节数同机器字长和编译器有关.如果要保证移植性,尽量用__int16 __int32 __int64吧__int16.__int32这种数据类型在所有平台下都分配相同的字节. ...
- 基于visual Studio2013解决C语言竞赛题之0609矩阵处理
题目
- Ubuntu下ssh免password登录安装
1.首先在本机安装openssh-server和openssh-client. 命令:sudo apt-get install openssh-server openssh-client 2.在检查当 ...
- soundPool播放短、频、快的声音
package com.example.soundpool; import android.media.AudioManager; import android.media.SoundPool; im ...
- TCPDump:捕获并记录特定协议 / 端口
Q. 如何使用 Linux / UNIX 平台下的 TCPDump 工具捕获特定协议或端口比如 80 (http)?如何使用 TCPDump 将流记录下来,然后(根据记录)查找到问题所在? ...