文档详情

24异常处理程序与软件异常.docx

发布:2017-06-01约2.98万字共27页下载文档
文本预览下载声明
第24章异常处理程序和软件异常异常是我们不希望有的事件。在编写程序的时候,程序员不会想去存取一个无效的内存地址或用0来除一个数值。不过,这样的错误还是常常会发生的。C P U负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对这些错误的反应。C P U引发的异常,就是所谓的硬件异常( hardware exception)。在本章的后面,我们还会看到操作系统和应用程序也可以引发相应的异常,称为软件异常( software exception)当出现一个硬件或软件异常时,操作系统向应用程序提供机会来考察是什么类型的异常被引发,并能够让应用程序自己来处理异常。下面就是异常处理程序的文法:__try { //Guarded body ...}__except(exception filter) { // Exception handler ...}注意__e x c e p t关键字。每当你建立一个t r y块,它必须跟随一个f i n a l l y块或一个e x c e p t块。一个try 块之后不能既有f i n a l l y块又有e x c e p t块。但可以在t r y - e x c e p t块中嵌套t r y - f i n a l l y块,反过来也可以。24.1 通过例子理解异常过滤器和异常处理程序与结束处理程序(前一章讨论过)不同,异常过滤器( exception filter)和异常处理程序是通过操作系统直接执行的,编译程序在计算异常过滤器表达式和执行异常处理程序方面不做什么事。下面几节的内容举例说明t r y - e x c e p t块的正常执行,解释操作系统如何以及为什么计算异常过滤器,并给出操作系统执行异常处理程序中代码的环境。24.1.1 Funcmeister1这里是一个t r y - e x c e p t i o n块的更具体的例子。DWORD Funcmeister1() { DWORD dwTemp; //1. Do any processing here. ... __try { //2. Perform some operation. dwTemp = 0;} __except(EXCEPTION_EXECUTE_HANDLER) { // Handle an exception; this never executes. ... } //3. Continue processing. return(dwTemp);}在F u n c m e i s t e r 1的t r y块中,只是把一个0赋给d w Te m p变量。这个操作决不会造成异常的引发,所以e x c e p t块中的代码永远不会执行。注意这与t r y - f i n a l l y行为的不同。在d w Te m p被设置成0之后,下一个要执行的指令是r e t u r n语句。尽管在结束处理程序的t r y块中使用r e t u r n、g o t o、c o n t i n u e和b r e a k语句遭到强烈地反对,但在异常处理程序的t r y块中使用这些语句不会产生速度和代码规模方面的不良影响。这样的语句出现在与e x c e p t块相结合的t r y块中不会引起局部展开的系统开销。24.1.2 Funcmeister2让我们修改这个函数,看会发生什么事情:DWORD Funcmeister2() { DWORD dwTemp = 0; //1. Do any processing here. ... __try { //2. Perform some operation(s). dwTemp = 5 / dwTemp; // Generates an exception dwTemp += 10; // Never executes } __except( /* 3. Evaluate filter. */ EXCEPTION_EXECUTE_HANDLER) { //4. Handle an exception. MessageBeep(0); ... } //5. Continue processing. return(dwTemp);}F u n c m e i s t e r 2中,t r y块中有一个指令试图以0来除5。C P U将捕捉这个事件,并引发一个硬件异常。当引发了这个异常时,系统将定位到e x c e p t块的开头,并计算异
显示全部
相似文档