發生硬體或軟體例外狀況時,處理器會在發生例外狀況的點停止執行,並將控制權傳輸至系統。 首先,系統會同時儲存目前線程的計算機狀態,以及描述例外狀況的資訊。 系統接著會嘗試尋找例外狀況處理程序來處理例外狀況。
發生例外狀況的線程機器狀態會儲存在CONTEXT結構。 這項資訊(稱為 內容記錄),可讓系統在成功處理例外狀況時繼續執行例外狀況。 例外狀況的描述(稱為 例外狀況記錄)會儲存在 EXCEPTION_RECORD 結構中。 因為它會將內容記錄的計算機相依資訊與例外狀況記錄的計算機獨立資訊分開儲存,所以例外狀況處理機制可移植到不同的平臺。
內容和例外狀況記錄中的資訊都可以透過 GetExceptionInformation 函式取得,而且可以提供給例外狀況結果所執行的任何例外狀況處理程式使用。 例外狀況記錄包含下列資訊。
- 識別例外狀況類型的例外狀況代碼。
- 指出例外狀況是否可持續性的旗標。 在不可連續的例外狀況之後繼續執行的任何嘗試都會產生另一個例外狀況。
- 另一個例外狀況記錄的指標。 這有助於在發生巢狀例外狀況時建立連結的例外狀況清單。
- 發生例外狀況的位址。
- 自變數陣列,提供例外狀況的其他資訊。
在使用者模式程式代碼中發生例外狀況時,系統會使用下列搜尋順序來尋找例外狀況處理程式:
- 如果進程正在偵錯,系統會通知調試程式。 如需詳細資訊,請參閱 除錯程式例外狀況處理。
- 如果進程未進行偵錯,或相關聯的調試程式未處理例外狀況,系統會藉由搜尋發生例外狀況之線程的堆疊框架,嘗試尋找以框架為基礎的例外狀況處理程式。 系統會先搜尋目前的堆疊框架,然後依反向順序搜尋先前的堆疊框架。
- 如果找不到任何框架型處理程式,或沒有框架型處理程式處理例外狀況,但進程正在進行偵錯,系統會第二次通知調試程式。
- 如果進程未進行偵錯,或相關聯的調試程式未處理例外狀況,則系統會根據例外狀況類型提供默認處理。 針對大部分的例外狀況,默認動作是呼叫 ExitProcess 函式。
當內核模式程式代碼發生例外狀況時,系統會在嘗試找出例外狀況處理程式時搜尋核心堆疊的堆疊框架。 如果找不到處理程式或沒有處理程序處理例外狀況,系統就會關閉,就像已呼叫 exitWindows函式一樣。