try,catch,throw-----C++

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中设定的终止函数了。

时间: 2024-10-05 16:30:28

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

C# 异常处理(Catch Throw)IL分析

1.catch throw的几种形式及性能影响: private void Form1_Click(object sender, EventArgs e) { try { } catch { throw; } } private void Form1_Load(object sender, EventArgs e) { try { } catch (Exception) { throw; } } private void Form1_Enter(object sender, EventArgs

C# try...catch...throw

try..catch..throw是C#里面处理异常的机制:我们在编码时,无论是在业务逻辑处理还是数理运算,都有可能有想不到的情况发生,比如在做基本算数运算时,可能出现溢出或者除零等问题,那么这就需要一种机制来处理这种异常,增强软件的性能和稳定,try catch throw 就是用来处理异常的. try 代码块中一般存放业务处理逻辑代码,比如尝试打开数据库连接时.处理业务运算时等,放在try内部的所有代码,一旦出现未知的异常情况,Try代码块中的代码便终止运行,而是跳到catch中,如果不放在

C++异常处理 - try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读 本文包括2个大的异常实现概念:C++的标准异常和SHE异常. C++标准异常: 也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢? 又或者试想一下一个能解决的错误

C++处理异常 try,catch,throw,finally

异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了.自序:对写程序来说异常真的是很重要,一个稳健的代码不是靠返回

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

软件运行过程中,如果出现了软件正常运行不应该出现的情况,软件就出现了异常.这时候我们需要去处理这些异常.或者让程序终止,避免出现更严重的错误.或者提示用户进行某些更改让程序可以继续运行下去. C#编程语言本身就为我们提供了这种异常处理机制. C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零.或者试图将一个字符串"aaa"转换成整数. 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式.C# 异常处理时建立在四个关键词之上的:try.catch.finally

T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)

原文:T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw) 本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出(try catch throw),本文简单介绍异常捕获与异常抛出在T-SQL编程中的实际使用 . 异常处理简单说明 异常捕获在应用程序编程中非常常见,提供了处理程序运行时出现的任何意外或异常情况的方法刚毕业的时候对于异常处理迷茫不解,

SQL Server ->> THROW字句对比RAISERROR字句

SQL Server 2012开始引入了THROW字句用于替代从SQL Server开始沿用至今的RAISERROR.既然作用相同,都是在TRY... CATCH代码块后不抓错误然后抛出错误,它们之间的差异是什么? RAISERROR statement THROW statement If a msg_id is passed to RAISERROR, the ID must be defined in sys.messages. The error_number parameter doe

[Erl_Question01] 使用catch与try catch避免嵌套nest_case

catch 如此好用,为什么官方还是推荐用try catch? 1. catch 的用法非常简单: catch case do_check(Test) of {ok,Result} -> do_thing(Result); {error,ErrReason} -> do_error(ErrReason) end. do_check(Test) -> case Test of 1 -> erlang:throw({error,to_small}); 2 –> {ok,2}; 9

什么时候要catch并抛出异常

自从接触Catch开始,就知道要catch不确定的代码然后抛出异常. 但是 随着项目层级调用越来越复杂,有些层要调用N端不确定的代码,各种Catch,并对exception的各种处理. 代码乱不说,也不好阅读维护. 一直在想 在哪一层Catch,throw,哪一次做处理. 知道今天才认定应该按照这样思维模式来做 底层官员向上一级反馈问题,下级必须要给上级一个确切(ErrCode,ErrDesc)的说法,不容许含糊其辞的推脱(Catch ,throw ex) 但是当某个级别的官员上头已经是最大的官