1.try,catch,throw:

try包含你要防护的代码 ,称为防护块. 防护块如果出现异常,会自动生成异常对象并抛出.

catch捕捉特定的异常,并在其中进行适当处理.

throw可以直接抛出/产生异常,导致控制流程转到catch块.

2.重要观点: C++中异常是用对象来表示的,称为异常对象.

3.基本格式:

try {    your code; }

catch(T1 t1)    //T1可以是任意类型,int,char...

{ /*T1指定了你要捕捉的异常的类型,t1指定了异常 对象的名称,当有异常抛出,异常对象将被复制到t1 中,这样你就可以在本处理块中使用该对象,获取相关信息,进行适当处理;*/}

catch(...)    //...是捕捉任意类型的异常.

/*某个catch执行完,就跳转到这里继续执行. 在没有使用C++异常处理的情况下,如果在此之前出现异常,则异常点以下的其他代码不会被执行从而造成问题.请考虑在这里放置: delete pobj1;如果不使用用try,catch机制,内存泄漏是必然的,因为出现问题后,执行流程无法跳转到这里. */

/*说明: try{}之后可以跟任意个catch块. 发生异常后,会生成临时的异常对象,进行一些自动处理之后,程序 流程跳转到后面的catch(),逐个检查这些catch(),如果与catch() 中指定的类型一致,则将对象拷贝给catch参数中的对象, 接着执行该catch块中的代码,然后跳过其他所有剩下的catch, 继续执行后续的代码. 上面所说的自动处理指的是堆栈回退,说白了就是为函数中的局部对象调用析构函数,保证这些局部对象行为良好. */

catch()的顺序通常按照:从特殊到一般的顺序: catch(Tsub o){} catch(Tbase o){} catch(...){}  如果第一个catch为catch(Tbase){},则它将捕捉其所有派生类的 异常对象.  如果第一个catch为catch(...){},则其后的所有catch永远不可能 被执行. 重新抛出异常: 从上面的处理机制可以看到,只有一个catch可能被执行, 如果一个catch被执行,其他后续的catch就会被跳过了.  有时候一个catch中可能无法完成异常的全部处理,需要将 异常提交给更高的层,以期望得到处理.重新抛出异常实现 了这种可能性. 语法:  throw ; 空的throw语句,只能在catch中使用.     它重新抛出异常对象,其外层的catch可能可以捕捉这个重新抛出的异常并做适当处理.

---------------------------------------------------------------------------------------------------------

1、基础介绍 try { //程序中抛出异常 throw value; } catch(valuetype v) { //例外处理程序段 } 语法小结:throw抛出值,catch接受,当然,throw必须在“try语句块”中才有效。
2、深入throw: (i)、程序接受到throw语句后就会自动调用析构器,把该域(try后的括号内)对象clean up,然后再进 入catch语句(如果在循环体中就退出循环)。
这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时,在 “类的构建器 ”中的throw语句引起的退出,会导致这个指针所指向的对象没有被析构。解决方法:把指针改为类就行了,比如模板类来代替指针,在模板类的内部设置一个析构函数。
(ii)、语句“throw;”抛出一个无法被捕获的异常,即使是catch(...)也不能捕捉到,这时进入终止函数。
3、深入catch: 一般的catch出现的形式是: try{} catch(except1&){} catch(except2&){} catch(...){} //接受所有异常 一般都写成引用(except1&),原因很简单,效率。
问题a:抛出异常,但是catch不到异常怎么办?在catch没有捕获到匹配的异常的时候,会调用默认的终止函数。可以调用set_terminate()来设置终止函数,参数是一个函数指针,类型是:void (*terminate)()。

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()  // 参数表为空,不能抛出异常
假设fun()中抛出了一个不在“异常参数表”中的异常,会怎么样?调用set_terminate()中设定的终止函数。然而,这只是表面现象,实际上是调用默认的unexpected()函数,然而这个默认的  unexpected()调用了set_terminate()中设定的终止函数。可以用set_unexpected()来设置unexpected,  就像set_terminate()一样的用法,但是在设定了新的“unexpected()”之后,就不会再调用set_terminater中设定的终止函数了。

try,catch,throw-----C++的更多相关文章

  1. Ruby跳出多层循环 catch...throw

    在编码的时候,有时候会遇到嵌套循环的情况,最内部的循环结束的时候,想跳出所有循环,这个时候我们往往采用通过内部循环设置一个flag来控制外部跳出循环条件,比如: #encoding:utf-8 for ...

  2. (六)JavaScript之[Regular Expression]与[错误(try, catch, throw)]

    10].正则表达式 /** * 正则表达式(Regular Expression): * * 用于文本搜索和文本替换 * */ /** * /good/i是一个正则表达式. * good是一个模式(用 ...

  3. js学习笔记2:循环和try/catch/throw

    今天学习了js的比较.if/else.switch/case和各种循环,这些东西每种语言都大同小异,没什么好看的,重点说一下js的循环. JavaScript 支持不同类型的循环: for - 循环代 ...

  4. C++异常处理:try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  5. C++异常处理: try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  6. php try catch throw 用法

    1.try catch 捕捉不到fatal error致命错误 2.只有抛出异常才能被截获,如果异常抛出了却没有被捕捉到,就会产生一个fatal error. 3.父类可以捕获抛出的子类异常,Exce ...

  7. [转] C++ try catch() throw 异常处理

    原文地址 其它很多程序员一样,本书的主人公阿愚也是在初学C++时,在C++的sample代码中与异常处理的编程方法初次邂逅的,如下:   // Normal program statements  . ...

  8. 异常处理(try catch throw)详解(C++)

    选择异常处理的编程方法的具体原因如下: 1.把错误处理和真正的工作分开来: 2.代码更易组织,更清晰,复杂的工作任务更容易实现: 3.毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了: 4 ...

  9. C++ 异常处理(try catch throw)、命名空间

    一.c++工具 模板(函数模板.类模板).异常处理.命名空间等功能是c++编译器的功能,语言本身不自带,这些功能已经成为ANSI C++标准了,建议所有的编译器都带这些功能,早期的c++是没有这些功能 ...

  10. 22 C#中的异常处理入门 try catch throw

    软件运行过程中,如果出现了软件正常运行不应该出现的情况,软件就出现了异常.这时候我们需要去处理这些异常.或者让程序终止,避免出现更严重的错误.或者提示用户进行某些更改让程序可以继续运行下去. C#编程 ...

随机推荐

  1. Mac OS X双系统变回虚拟机

    Mac OS X双系统变回虚拟机 自从装了双系统后,感觉不要太好,装了虚拟机就开始有工作的干劲了.不妙的是,我在Win7系统里并没有装office,用不了word文档就写不了笔记和总结.我不太想在Wi ...

  2. C语言-数据类型

    数据类型 -基本数据类型 --char 字符型 --int  整型 --浮点型 ---float ---double -指针类型 --void* -空类型 -构架类型 --数组[] --结构体 str ...

  3. 《理解 ES6》阅读整理:函数(Functions)(八)Tail Call Optimization

    尾调用优化(Tail Call Optimization) 尾调用是指函数的最后一条语句是函数调用,比如下面的代码: function doSomething() { return doSomethi ...

  4. 【Bugly干货分享】老司机教你 “飙” EventBus 3

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. EventBus对于Android ...

  5. s3c2440笔记1(启动)

    s3c2440启动方式 1. 从nand flash 启动 1.1 上电后将nand flash中的前4KB数据复制到“Stepping Stone”: 1.2 CPU 执行“Stepping Sto ...

  6. Guava - EventBus(事件总线)

    Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...

  7. 探求网页同步提交、ajax和comet不为人知的秘密(中篇)

    深入研究某项技术,了解使用这些技术的细节,其实最终目的都是为了完成一个选择问题:当我们要使用这些技术解决某个具体的问题时候我们到底该如何去选择.如果碰到有两种技术可以让我们达到同样的目的,我们就会不自 ...

  8. PosePlus的第一次突破

    动作问题一定要解决 PosePlus是解决这个问题的库 (之前叫做CleanData.Ani,后来我想过,之前的设计各个库之间的依赖太重了) 现在把他们之间的依赖剥开.   PosePlus解决几个问 ...

  9. Android Studio2.x版本无法自动关联源码的解决方法

    Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...

  10. 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...