<b>C++中的非常(exception)</b>[VC/C++编程]
本文“<b>C++中的非常(exception)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1.简介
非常是由语言供应的运行时刻错误处理的一种方法.提到错误 处理,即便不提到非常,你大约也已经有了丰富的经验,但是为了可以清楚的看 到非常的好处,我们还是无妨往复想一下常用的以及不常用的错误处理方法.
1.1 常用的错误处理方法
返回值.我们常用函数的返回值来标志成功或 者失利,乃至是失利的缘由.但是这种做法最大的问题是假如调用者不主动查抄 返回值也是可以被编译器承受的,你也何如不了他:) 这在C++中还招致别的一个 问题,就是重载函数不能只有差别的返回值,而有相同的参数表,因为假如调用 者不查抄返回值,则编译器会不知道应当调用哪个重载函数.当然这个问题与本 文无关,我们暂且放下.只要服膺返回值大概被忽视的情形便可.
全局 状况标志.比方系统调用利用的errno.返回值差别的是,全局状况标志可以让 函数的接口(返回值、参数表)被充分操纵.函数在退出前应当设置这个全局变 量的值为成功大概失利(包含缘由),而与返回值一样,它隐含的要求调用者要 在调用后查抄这个标志,这种约束实在是一样脆弱.全局变量还招致了别的一个 问题,就是多线程不安全:假如多个线程同时为一个全局变量赋值,则调用者在 查抄这个标志的时刻一定会非常迷惑.假如但愿线程安全,可以参照errno的解 决办法,它是线程安全的.
1.2 不常用的处理方法
setjmp()/longjmp() .可以认为它们是远程的goto语句.按照我的经验,它们好象确切不常被用到, 大概是多少破坏了构造化编程气势的缘由吧.在C++中,应当是越发的不要用它 们,因为致命的弱点是longjmp()固然会unwinding stack(这个词背面再说), 但是不会调用栈中对象的析构函数--够致命吧.关于差别的编译器,大概可以通 过加某个编译开关来办理这个问题,但太不通用了,会招致程序很难移植.
1.3 非常
目前我们再来看看非常能办理什么问题.关于返回值和 errno碰到的尴尬,对非常来说基本上不存在,假如你不捕捉(catch)程序中抛出 的非常,默许行为是招致abort()被调用,程序被终止(core dump).因此你的函 数假如抛出了非常,这个函数的调用者大概调用者的调用者,也就是在当前的 call stack上,一定要有一个地方捕捉这个非常.而关于setjmp()/longjmp()带 来的栈上对象不被析构的问题对非常来说也是不存在的.那么它能否破坏了构造 化(关于OO paradigms,大概应当说是破坏了流程?)呢?明显不是,有了非常 之后你可以安心的只书写精确的逻辑,而将全部的错误处理归结到一个地方,这 不是更好么?
综上所述,在C++中大约非常可以全面替换别的的错误处理 方法了,但是假如代码中处处充斥着try/throw/catch也不是件功德,欲知非常 的利用本领,请保持耐烦持续阅读:)
2. 非常的语法
在这里我们只谈论一 些语法相关的问题.
2.1 try
try老是与catch一同呈现,伴随一个try语 句,至少应当有一个catch()语句.try随后的block是大概抛出非常的地方.
2.2 catch
catch带有一个参数,参数范例以及参数名字都由程序指定, 名字可以忽视,假如在catch随后的block中并不打算引用这个非常对象的话.参 数范例可以是build-in type,比方int, long, char等,也可以是一个对象,一 个对象指针大概引用.假如但愿捕捉肆意范例的非常,可以利用 “...”作为catch的参数.
catch不一定要全部捕捉try block中抛出的非常,剩下没有捕捉的可以交给上一级函数处理.
以上是“<b>C++中的非常(exception)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |