条目1、由CPU抛出的异常都是硬件异常,由操作系统和应用程序抛出的异常通常被称为软件异常。(P638)
条目2、异常处理程序的语法结构:(P638)
__try { //Guarded body //.. } __except(Exception filter) { //Exception handler //.. }
任何一个try,后面必须跟着finally或except中的任意一个代码块(不能同时拥有)。try - finally/except可嵌套使用。
条目3、与终止处理程序不同,异常过滤程序和异常处理程序主要由操作系统负责执行 - 编译器所做的工作十分有限。(P638)
条目4、在异常处理程序的try块中,return、goto、continue、break等语句不会导致程序性能损失或者增加代码量。换句话说,这些语句在try块中不会带来局部展开这样的额外开销。(P639)
条目5、except块执行完毕后程序依据过滤表达式中的返回值(EXCEPTION_EXECUTE_HANDLER/EXCEPTION_CONTINUE_EXECUTION),来决定是从发生异常的那条指令开始执行还是从except块后继续执行。(P642)
条目6、当异常过滤程序的计算结果为EXCEPTION_EXECUTE_HANDLER时候,系统必须执行全局展开。全局展开导致所有已经执行但尚未完成的try/finally块得以继续执行。(P645)
条目7、从WINDOWS VISTA开始,如果一个异常发生在try/finally块中,并在其上层又没有try/except块(且过滤表达式返回EXCEPTION_EXECUTE_HANDLER),进程会立即终止。即全局展开不会发生,finally块也不会执行。(P647)
条目8、通过将return语句置于finally块中可以阻止系统完成全局展开。(P647)
void fun1() { try { fun2(); //1 } __except(EXCEPTION_EXECUTE_HANDLER) //4 { //这里不会被执行! MessageBeep(0); } MessageBox(...);//7 } void fun2() { fun3(); //2 MessageBox(...); //6 } void fun3() { __try { strcpy(NULL,NULL); //3 } __finally { return ; //5 } }
条目9、内联函数GetExceptionCode只能在过滤表达式中调用,其返回值代表发生的异常类型。(P652)
条目10、内联函数GetExceptionInformation只能在过滤表达式中调用,其返回值指向异常的信息。(P656)
条目11、软件异常通过RaiseException抛出!