windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)
生活随笔
收集整理的這篇文章主要介紹了
windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先要要知道,結(jié)構(gòu)化異常處理(SEH)和C++提供的異常處理不相同。
一.Termination Handlers
Termination Handlers使用很簡單。在想使用SEH處理的地方使用
__try{/* [__leave;] */}
__finally{/*?[AbnormalTermination] */}
即可。
SEH保證,無論__try中的代碼怎樣退出(正常執(zhí)行完畢、retrun、goto、異常等等),都能保證__finally中的代碼被執(zhí)行。
1.在__try塊之外的代碼則沒有這種特性。另外,TerminateThread或者TerminateProcess則使程序沒有機(jī)會(huì)執(zhí)行__finally里的代碼;
2.如果__finally塊中有return語句,那么將不會(huì)執(zhí)行其他return語句;
3.因此應(yīng)盡量少在__try塊中放置return、goto等語句,在__finally語句中同樣如此;
4.盡量使用__leave代替不可避免的return,__leave不會(huì)增加系統(tǒng)開銷;
5.AbnormalTermination只用在__finally塊中,如果是正常控制流進(jìn)入__finally塊,那么此函數(shù)返回FALSE,否則返回TRUE.
我們已經(jīng)看到結(jié)束處理程序在補(bǔ)救t?r?y塊中的過早退出的執(zhí)行方面很有效,但也看到結(jié)束處理程序由于要阻止t?r?y塊的過早退出而產(chǎn)生了我們不希望有的結(jié)果。更好的辦法是在結(jié)束處理程序的t?r?y塊中避免任何會(huì)引起過早退出的語句。實(shí)際上,最好將r?e?t?u?r?n、c?o?n?t?i?n?u?e、b?r?e?a?k、g?o?t?o等語句從結(jié)束處理程序的t?r?y塊和f?i?n?a?l?l?y塊中移出去,放在結(jié)束處理程序的外面。這樣做會(huì)使編譯程序產(chǎn)生較小的代碼,因?yàn)椴恍枰俨蹲絫?r?y塊中的過早退出,也使編譯程序產(chǎn)生更快的代碼(因?yàn)閳?zhí)行局部展開的指令也少)。另外,代碼也更容易閱讀和維護(hù)。
二.Exception Handlers and Software Exceptions
__try{/*?... */}
__except(filter){/*?... */}
1.__except可以指定要過濾的條件,也可以是一個(gè)過濾函數(shù)。過濾函數(shù)返回3個(gè)異常之一;
2.與__finally不同的是,執(zhí)行過__except塊中的代碼后,將繼續(xù)執(zhí)行該塊之后的代碼;
3.注意在與__except塊配對(duì)的__try塊中嵌套__finally時(shí)的情形(先執(zhí)行所有__except塊對(duì)應(yīng)的__try塊里的__finally,然后最終執(zhí)行__except);
4.在__finally中寫入return,可以阻止繼續(xù)執(zhí)行__except;
5.如果過濾函數(shù)返回EXCEPTION_CONTINUE_EXECTION,那么將不執(zhí)行__except中的代碼,而是返回到出現(xiàn)異常的代碼,重新執(zhí)行本條代碼;
6.如果fliter是EXCEPTION_CONTINUE_SEARCH,那么本__except不處理該異常,繼續(xù)像上層查找。如果所有的__except都沒有處理EXCEPTION_EXECUTE_HANDLER,那么最終系統(tǒng)將調(diào)用UnhandledExceptionFilter,用來顯示未處理異常的對(duì)話框,并讓用戶選擇是否調(diào)試等等。如果用戶選擇了調(diào)試,那么UnhandledExceptionFilter就運(yùn)行調(diào)試器進(jìn)程,并附加本進(jìn)程id作為參數(shù),調(diào)試開始了;
7.fliter中可以通過GetExceptionCode獲取異常的代碼,這很有用滴.PS:不能再過濾函數(shù)里調(diào)用此函數(shù)哦;
8.可以通過調(diào)用GetExceptionInformation()能獲取更詳細(xì)的異常時(shí)信息,比如寄存器等等,同樣,也只能在filter中調(diào)用;
9.通過調(diào)用RaiseException來觸發(fā)一個(gè)軟件異常。
三.C++異常和結(jié)構(gòu)化異常
在VC++中,如果你使用了C++的try、catch等等,會(huì)自動(dòng)被轉(zhuǎn)化為SEH。例如,throw被轉(zhuǎn)化為RaiseException,而catch則是__except。
一.Termination Handlers
Termination Handlers使用很簡單。在想使用SEH處理的地方使用
__try{/* [__leave;] */}
__finally{/*?[AbnormalTermination] */}
即可。
SEH保證,無論__try中的代碼怎樣退出(正常執(zhí)行完畢、retrun、goto、異常等等),都能保證__finally中的代碼被執(zhí)行。
1.在__try塊之外的代碼則沒有這種特性。另外,TerminateThread或者TerminateProcess則使程序沒有機(jī)會(huì)執(zhí)行__finally里的代碼;
2.如果__finally塊中有return語句,那么將不會(huì)執(zhí)行其他return語句;
3.因此應(yīng)盡量少在__try塊中放置return、goto等語句,在__finally語句中同樣如此;
4.盡量使用__leave代替不可避免的return,__leave不會(huì)增加系統(tǒng)開銷;
5.AbnormalTermination只用在__finally塊中,如果是正常控制流進(jìn)入__finally塊,那么此函數(shù)返回FALSE,否則返回TRUE.
我們已經(jīng)看到結(jié)束處理程序在補(bǔ)救t?r?y塊中的過早退出的執(zhí)行方面很有效,但也看到結(jié)束處理程序由于要阻止t?r?y塊的過早退出而產(chǎn)生了我們不希望有的結(jié)果。更好的辦法是在結(jié)束處理程序的t?r?y塊中避免任何會(huì)引起過早退出的語句。實(shí)際上,最好將r?e?t?u?r?n、c?o?n?t?i?n?u?e、b?r?e?a?k、g?o?t?o等語句從結(jié)束處理程序的t?r?y塊和f?i?n?a?l?l?y塊中移出去,放在結(jié)束處理程序的外面。這樣做會(huì)使編譯程序產(chǎn)生較小的代碼,因?yàn)椴恍枰俨蹲絫?r?y塊中的過早退出,也使編譯程序產(chǎn)生更快的代碼(因?yàn)閳?zhí)行局部展開的指令也少)。另外,代碼也更容易閱讀和維護(hù)。
二.Exception Handlers and Software Exceptions
__try{/*?... */}
__except(filter){/*?... */}
1.__except可以指定要過濾的條件,也可以是一個(gè)過濾函數(shù)。過濾函數(shù)返回3個(gè)異常之一;
2.與__finally不同的是,執(zhí)行過__except塊中的代碼后,將繼續(xù)執(zhí)行該塊之后的代碼;
3.注意在與__except塊配對(duì)的__try塊中嵌套__finally時(shí)的情形(先執(zhí)行所有__except塊對(duì)應(yīng)的__try塊里的__finally,然后最終執(zhí)行__except);
4.在__finally中寫入return,可以阻止繼續(xù)執(zhí)行__except;
5.如果過濾函數(shù)返回EXCEPTION_CONTINUE_EXECTION,那么將不執(zhí)行__except中的代碼,而是返回到出現(xiàn)異常的代碼,重新執(zhí)行本條代碼;
6.如果fliter是EXCEPTION_CONTINUE_SEARCH,那么本__except不處理該異常,繼續(xù)像上層查找。如果所有的__except都沒有處理EXCEPTION_EXECUTE_HANDLER,那么最終系統(tǒng)將調(diào)用UnhandledExceptionFilter,用來顯示未處理異常的對(duì)話框,并讓用戶選擇是否調(diào)試等等。如果用戶選擇了調(diào)試,那么UnhandledExceptionFilter就運(yùn)行調(diào)試器進(jìn)程,并附加本進(jìn)程id作為參數(shù),調(diào)試開始了;
7.fliter中可以通過GetExceptionCode獲取異常的代碼,這很有用滴.PS:不能再過濾函數(shù)里調(diào)用此函數(shù)哦;
8.可以通過調(diào)用GetExceptionInformation()能獲取更詳細(xì)的異常時(shí)信息,比如寄存器等等,同樣,也只能在filter中調(diào)用;
9.通過調(diào)用RaiseException來觸發(fā)一個(gè)軟件異常。
三.C++異常和結(jié)構(gòu)化異常
在VC++中,如果你使用了C++的try、catch等等,會(huì)自動(dòng)被轉(zhuǎn)化為SEH。例如,throw被轉(zhuǎn)化為RaiseException,而catch則是__except。
轉(zhuǎn)載于:https://www.cnblogs.com/yoran/archive/2008/03/04/1090379.html
總結(jié)
以上是生活随笔為你收集整理的windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【积跬步以至千里】唧唧Down下载视频无
- 下一篇: 基于Java的实现宠物管理系统的设计与实