請試著-除非陳述式 (C)
Microsoft 專有的
試-除了陳述式是以 c 語言可讓應用程式,以取得程式的控制權,正常終止執行的事件發生時的 Microsoft 擴充功能。 這類事件稱為 「 例外狀況,而處理的例外狀況的機制就稱為結構化的例外處理。
例外狀況可能是硬體或軟體為基礎。 即使在應用程式完全無法復原的硬體或軟體的例外狀況,結構化的例外處理讓顯示錯誤資訊,及設陷的應用程式,以協助診斷問題的內部狀態。 這特別適用於間歇性無法輕易地重現的問題。
語法
try 陳述除了:
__try 複合陳述式__except ( 運算式**)** 複合陳述式
複合陳述式之後, __try子句是保護的區段。 複合陳述式之後, __except子句是例外處理常式。 這個處理常式指定一組保護區段在執行期間引發例外狀況時所要採取的動作。 執行如下所示:
執行保護的區段。
如果執行保護的區段時,就會不發生任何例外狀況,在之後的陳述式會繼續執行__except子句。
如果保護的區段在執行期間發生例外狀況,或是在任何的常式會呼叫保護的區段,__except在評估運算式,並傳回的值會決定如何處理例外狀況。 有三個值:
EXCEPTION_CONTINUE_SEARCH無法辨認例外狀況。 抑制優先搜尋的處理常式,在堆疊中向上繼續試-除了陳述式,然後對下一個最高優先順序的處理常式。
EXCEPTION_CONTINUE_EXECUTION辨識例外狀況,但會關閉。 發生例外狀況的點繼續執行。
EXCEPTION_EXECUTE_HANDLER辨識例外狀況。 將控制傳輸至例外狀況處理常式中,藉由執行__except複合陳述式,然後在發生例外狀況的點繼續執行。
因為__except為 c 運算式評估運算式,它是限制為單一值、 條件式運算式運算子或逗號運算子。 如果需要更多的處理,運算式便可呼叫的常式會傳回其中一個三個以上所列的值。
注意事項 |
---|
與 c 和 C++ 原始程式檔搭配使用結構化的例外處理。不過,它是不被專門針對 C++。您可以確保您的程式碼使用 C++ 例外處理會更好移植。此外,C++ 例外處理機制會更有彈性,因為它可以處理任何型別的例外狀況。 |
注意事項 |
---|
C + + 程式,則應使用而非結構化的例外處理的 C++ 例外處理。如需詳細資訊,請參閱例外狀況處理 在 C + + 語言參考。 |
應用程式中的每個常式可以有自己的例外狀況處理常式。 __except的範圍內執行的運算式__try內文。 這表示它已那里宣告的區域變數的存取。
__leave關鍵字是在試-除了陳述式區塊。 效果__leave跳至結尾是試-除了區塊。 例外處理常式的結束位址後,繼續執行。 雖然goto陳述式可以用來達到相同的結果, goto陳述式會造成堆疊回溯。 __leave陳述式會比較有效率,因為並未牽涉堆疊回溯。
結束試-除了陳述式使用longjmp執行階段函式會被視為不正常終止。 不能跳到應在__try陳述式,但是跳足夠的法律。 如果處理程序已刪除的執行例外處理常式不會呼叫試-除了陳述式。
範例
下列為例外處理常式,並終止處理常式的範例。 請參閱 try finally 陳述式如需有關終止的處理常式。
.
.
.
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
RAISE_AN_EXCEPTION();
}__finally{
puts("in finally");
}
}__except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ){
puts("in except");
}
puts("world");
這是範例中,以加入在右側的註解的輸出:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
結束 Microsoft 特定