请参考 TC++PL 章节 8.3、第十四章,以及附录 E。附录聚焦于如何为“苛刻的”应用程序编写异常安全(exception-safe)的代码,它并非写给初学者看的。
C++ 里,异常用于发出一种信号,表示发生了“本地”处理不了的错误,比如构造函数里某个获取资源的操作失败了。例如:
class Vector {
int sz;
int* elem;
class Range_error { };
public:
Vector(int s) : sz(s) { if (sz < 0) throw Range_error(); /* ... */ }
// ...
};
不要简单地将异常当作又一种从函数中返回一个值的方法。大多数用户以为异常处理代码等同于错误处理代码(因为 C++ 语言的定义怂恿他们这么想),他们的代码优化方式也反映了这种想当然的“以为”。
一种关键的技术被称之为资源获取即初始化(有时被简称为 RAII),该技术使用带有析构函数的类来使资源管理有序化。例如:
void fct(string s)
{
File_handle f(s,"r"); // File_handle 的构造函数打开名为 s 的文件
// 使用 f
} // File_handle 的析构函数在此关闭文件
就算 fct() 中“使用 f”的那部分代码抛出了异常,析构函数仍然会被执行,所以文件会被正常关闭。下面这种常见的不安全的用法则恰恰相反:
void old_fct(const char* s)
{
FILE* f = fopen(s,"r"); // 打开名为 s 的文件
// 使用 f
fclose(f); // 关闭文件
}
如果 old_fct 中“使用 f”的那部分代码抛出了异常(或者简单地返回了),那么文件就没有被关闭。在 C 程序里,longjmp() 是又一种危险。
原文地址:http://www.research.att.com/~bs/bs_faq2.html#exceptions
分享到:
相关推荐
一.什么是异常 我们需要明白的是异常的发生不是因为我们代码写错了,我们的代码是可以编译的,但是在运行时产生了一个错误,这个错误是一个异常情况,计算机不能处理这个...第二种方法:使用try语句处理异常,事实上
如果这些错误得不到正确的处理将会导致程序终止运行,所以本结需要学习Python强大的异常处理机制,合理地使用异常处理可以使程序更加健壮,具有更强的容错性,不会因为错误地输入或运行时遇到的问题而造成程序终止。...
Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码...
我们在捕获到异常并对异常进行处理时可能会遇到如下一些问题: 1.不确定应如何处理这些异常 2.需要记录异常日志时没有记录,或者异常在不同的地方重复记录,使得排错调试不方便 3.处理日志时,需要在每一个try-catch...
Java中的异常处理机制是一种用于捕获和处理程序运行过程中可能出现的异常情况的机制。...处理方式可以是使用 try-catch 块捕获异常并处理,或者在方法签名中使用 throws 关键字声明将异常抛出给调用者处理。
本文是探讨如何自定义异常以及使用自定义的异常。 在进行程序开发的过程中,自定义异常遵循以下四个步骤: 1)首先创建自定义异常类,语法格式:自定义异常类名 extends Exception。 2)在方法中通过...
在java的世界里,异常是一个永恒的话题,很多情况下,如何使用异常?使用checked exception 还是 unchecked exception?成为了衡量一个java程序员是高手还是菜鸟的标准。exception-framework提供了一种托管异常的...
如何使用windows network monitor找出异常发包程序?.pdf
(3)对抛出的异常使用try-catch进行异常处理。 实践二:使用try-catch-finally进行异常处理 需求说明 (1)对实践1的异常使用try-catch-finally进行异常处理 (2)在finally块输出是否抛出了异常 实现思路及关键...
java java异常java java异常java java异常java java异常java java异常java java异常java java异常
Java的异常处理为什么会影响性能?异常开销很大。那么,这是不是就意味着您不该使用异常?当然不是。但是,何时应该使用异常,何时又不应该使用异常呢?不幸的是,答案不是一下子就说得清楚的,我们来详细探讨下。
在实验四和实验五中,在银行类中使用数组存放客户,在客户类中使用数组存放帐号,客户和帐号的数量受到了限制,不能随意增加。修改程序,改用ArrayList来存放客户和帐号,最后测试你的程序。 【Account类代码(填写...
使用异常处理输入是,输出三边,不是输出异常,还有输入取钱时也会输出的异常的问题
利用EGM96地球重力场模型计算高程异常及重力异常,使用语言为vs2012下的C#,使用跨阶次递推勒让德函数。(无数据)
1.异常和标准 C 对它的支持 2. Microsoft 对异常处理方法的扩展 3. 标准 C++异常处理的基本语法和语义 4. 实例剖析 EH 5. C++的 new 和 delete 操作时的异常处理 ...17. C++异常和 Visual C++ SEH 的混合使用
金蝶K3清除用户异常信息工具:用于解决某些情况下个别用户操作报错或缓慢等异常情况,清理后台用户信息表。在安装了K/3客户端的电脑上运行,选择用户登陆、清理即可,不用记SQL语句、不用登陆服务器,操作方便快捷。...
java 自定义异常--编译异常和运行异常2种;Java异常机制可以保证程序更安全和更健壮。虽说Java类库已经提供很多可以直接处理异常的类,但是有时候为了更加地捕获和处理...本文是探讨如何自定义异常以及使用自定义的异常
学生对象现和工人对象的比较,如果对学生和工人进行比较则抛出异常。
很多工程师常常会发现这样的一个问题,自己做好的电路板在调试过程中没有发现有任何的异常,但是却在使用不久发现各种问题或者出现故障。其最主要的原因就是异常信号在调试过程中没有正确抓出,导致错误的测量结果。...
教你如何运用异常处理,有个自编异常的小例子