现在的位置: 首页 > 综合 > 正文

c++ 中 try catch 的一些

2013年07月19日 ⁄ 综合 ⁄ 共 841字 ⁄ 字号 评论关闭

习惯了在 JS 中写 try catch 语句,所以在c++代码中瞎写。。杯具。我对c++的了解太少了。

 

1.在C++中,很多错误是try{}catch{}捕获不到的,比如空指针访问,野指针访问等,程序都直接崩溃,不会让你捕获的。所以,很遗憾,我惯用try catch,并没有达到预期。

 

2. 绝大多数 windows api 在执行时也并不抛出异常,直接挂掉。还是要对每一个问题做其相应的处理,才不至于挂掉。

 

3. 但可考虑用 GetLastError 获取错误信息。

 

4. 另,考虑到性能问题:

 

在c++程序中,try {} catch{} 是有代价的。

每一个try {} catch{} 都会降低执行效率。增加文件大小。
故此,不可滥用try {} catch{} ,只有那些不能明确捕捉的错误才应用try {} catch{} ,比如IO错误。
能通过返回值或者其他方式检查的错误,绝对不要用try {} catch{} 。

但是在C#,VB.NET等语言中,try {} catch{} 虽然同样不可滥用,
但 不会像C++一样增加文件大小。这与C++语言对于try {} catch{} 的实现有关。

 

附解析:

 

引用两处参考:More effective c++: item 15 "Understand the costs of exception
handling" 以及 CLR via C#(2nd) Chapter 19 : Exceptions
简单地说,C++中处理异常时,需要记录一些信息,如哪些对象已经成功构造,抛出异常
时哪些对象的析构函数需要调用。记录这些信息是一个不小的开销,同时编译器也会产
生一些code完成这些任务,因此程序尺寸也会增加。
对于managed code, 对象的生命期由GC管理,因此处理异常时,bookkeeping的任务减轻
了很多,因此效率会高一些。但因为相同的managed code经JIT编译后在不同的平台上(
x86, x64或IA64)差异很大,exception的开销也就难以一言概之,需要在不同的平台上
测试才能知道性能的损失。
回去补课。。

抱歉!评论已关闭.