核心内容摘要
LZW算法在GIF和TIFF中的应用:为什么30年前的压缩技术仍在用?
Windows SEH之全局展开这里说说SEH中让人费解的全局展开部分。
在此之前先复习一下结构化异常处理的流程当异常过滤程序的计算结果为EXCEPTION_EXECUTE_HANDLER时系统会执行全局展开。
下面这张图片展示了全局展开的流程图对应上图中全局展开的部分当一个异常出现的时候会从检查当前异常的try块是否可以处理该异常也就是看看是不是有except块且Filter的计算结果是否为EXCEPTION_EXECUTE_HANDLER如果不可以则检查当前try块中是否有finally块有则执行然后沿着调用链向上查找也就是看看上级函数中是否有try-except块可以处理该异常。
如果找到可以处理该异常的except块则执行异常处理程序执行结束后从异常处理程序的下一条语句开始继续运行。
示例分析一下面来看一个例子#includeiostream#includeWindows.hintExceptionFilter(){std::coutExceptionFilterstd::endl;returnEXCEPTION_EXECUTE_HANDLER;}voidfuncA(){__try{std::coutfuncA trystd::endl;// exception*(PBYTE)NULL5;std::coutfuncA try endstd::endl;}__except(ExceptionFilter()){std::coutfuncA ExceptionFilterstd::endl;}}voidfuncB(){__try{std::coutfuncB trystd::endl;funcA();std::coutfuncB try endstd::endl;}__finally{std::coutfuncB finallystd::endl;}}voidfuncC(){__try{std::coutfuncC trystd::endl;funcB();std::coutfuncC try endstd::endl;}__finally{std::coutfuncC finallystd::endl;}}intmain(intargc,charconst*argv[]){// C - B - AfuncC();return0;}运行结果如下示例分析二#includeiostream#includeWindows.hintExceptionFilter(){std::coutExceptionFilterstd::endl;returnEXCEPTION_EXECUTE_HANDLER;}voidfuncA(){__try{std::coutfuncA trystd::endl;// exception*(PBYTE)NULL5;std::coutfuncA try endstd::endl;}__finally{std::coutfuncA finallystd::endl;}}voidfuncB(){__try{std::coutfuncB trystd::endl;funcA();std::coutfuncB try endstd::endl;}__except(ExceptionFilter()){std::coutfuncB ExceptionFilterstd::endl;}}voidfuncC(){__try{std::coutfuncC trystd::endl;funcB();std::coutfuncC try endstd::endl;}__finally{std::coutfuncC finallystd::endl;}}intmain(intargc,charconst*argv[]){// C - B - AfuncC();return0;}运行结果如下