當(dāng)你正在調(diào)試程序的時(shí)候,你是否曾經(jīng)看到過消息窗口輸出關(guān)于“First Chance Exception”(第一輪異常)的信息?也許有人會(huì)問,“什么是第一輪異常?”、“出現(xiàn)第一輪異常的提示意味著代碼有問題嗎?”
什么是第一輪異常?
(1)當(dāng)一個(gè)程序被調(diào)試的時(shí)候,如果有異常發(fā)生調(diào)試器會(huì)得到通知,這個(gè)時(shí)候,被調(diào)試的應(yīng)用程序?qū)?huì)被掛起并且調(diào)試器決定如何來(lái)處理這個(gè)異常。當(dāng)一個(gè)異常第一次經(jīng)過這種機(jī)制就是所謂的“第一輪異常”。根據(jù)調(diào)試器的設(shè)置,調(diào)試器可能會(huì)忽略這個(gè)異常并讓程序繼續(xù)執(zhí)行,或者保持被調(diào)試程序的掛起狀態(tài)并進(jìn)入調(diào)試模式。
如果應(yīng)用程序無(wú)法處理這個(gè)異常,調(diào)試器會(huì)再次得到通知,這個(gè)就是所謂的“Second Chance Exception”(第二輪異常)了。同樣調(diào)試器會(huì)再次掛起被調(diào)試程序并決定如何來(lái)處理這個(gè)異常。通常情況下,當(dāng)?shù)诙啴惓0l(fā)生的時(shí)候,調(diào)試器都被配置為進(jìn)入調(diào)試模式,來(lái)允許用戶進(jìn)行調(diào)試。
出現(xiàn)第一輪異常的提示意味著代碼有問題嗎?
第一輪異常的提示消息通常并不意味著代碼有問題,對(duì)于那些能完善處理異常的程序或者組件來(lái)說,出現(xiàn)第一輪異常的提示信息意味著出現(xiàn)了一個(gè)異常并且得到了妥善的處理。
對(duì)于沒有異常處理代碼的程序來(lái)說,調(diào)試器會(huì)收到第二輪異常通知并且會(huì)提示沒有處理的異常信息。
(以上信息整理自《What is a First Chance Exception》)
異常與調(diào)試器
Microsoft Visual Studio的調(diào)試器為異常調(diào)試提供了出色的支持。當(dāng)進(jìn)程中的某個(gè)線程拋出異常,操作系統(tǒng)會(huì)馬上通知調(diào)試器(如果調(diào)試器已經(jīng)附著)。這個(gè)通知被稱為“首次機(jī)會(huì)通知”(first-chance notification)。調(diào)試器將響應(yīng)這個(gè)通知,促使線程尋找異常過濾程序。如果所有的異常過濾程序都返回EXCEPTION_CONTINUE_SEARCH,操作系統(tǒng)會(huì)給調(diào)試器一個(gè)“最后機(jī)會(huì)通知”(last-chance notification)。這兩個(gè)通知的存在使得軟件開發(fā)人員能夠更好的控制異常調(diào)試的過程。
針對(duì)每個(gè)解決方案,我們可以通過Visual Studio調(diào)試器的“調(diào)試”-“異常”菜單打開Exceptions對(duì)話框決定調(diào)試器如何響應(yīng)首次機(jī)會(huì)異常通知。

(以上信息整理自《Windows核心編程》)
個(gè)人總結(jié):對(duì)于First Chance Exception和Second/Last Chance Exception,這些都只會(huì)出現(xiàn)于調(diào)試器中。前者意味著被調(diào)試程序確實(shí)產(chǎn)生了一個(gè)異常,如果被調(diào)試程序自己處理掉了這個(gè)異常,那么就不會(huì)出現(xiàn)Second/Last Chance Exception的提示,反之如果沒有處理則出現(xiàn)Second/Last Chance Exception的提示;如果是一個(gè)正常執(zhí)行的程序,Second/Last Chance Exception意味著這個(gè)程序的終止運(yùn)行。
本文出自程序人生 >> What is a First Chance Exception(什么是第一輪異常)
推薦閱讀:
來(lái)用低級(jí)鍵盤鉤子實(shí)現(xiàn)鍵盤改鍵QQScLauncher逆向分析