撰寫例外狀況篩選條件
您可以處理例外狀況,使其跳躍至例外狀況處理常式的層級,或繼續執行。除了使用例外狀況處理常式程式碼來處理例外狀況,並下降,您可以使用篩選來清除問題然後傳回 – 1,而不清除堆疊中繼續正常流程。
注意事項 |
---|
無法繼續某些例外狀況。如果篩選評估結果為 – 1,這類例外狀況,系統會引發新的例外狀況。當您呼叫 RaiseException,您可以決定是否將會繼續的例外狀況。 |
例如,下列程式碼中呼叫的函式的用法篩選運算式: 這個函式處理這個問題,則會傳回 – 1,若要恢復正常控制流程:
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
int Eval_Exception( int );
__try {}
__except ( Eval_Exception( GetExceptionCode( ))) {
;
}
}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
if ( n_except != STATUS_INTEGER_OVERFLOW &&
n_except != STATUS_FLOAT_OVERFLOW ) // Pass on most exceptions
return EXCEPTION_CONTINUE_SEARCH;
// Execute some code to clean up problem
ResetVars( 0 ); // initializes data to 0
return EXCEPTION_CONTINUE_EXECUTION;
}
最好使用中的函式呼叫篩選 運算式時 篩選需要執行任何複雜的動作。評估運算式在此情況下,會使函式,執行Eval_Exception。
請記得使用 GetExceptionCode 來判斷例外狀況。您必須呼叫這個函式內部篩選器。Eval_Exception無法呼叫 GetExceptionCode,但您必須先將傳遞給它的例外狀況代碼。
這個處理常式會將控制權至另一個處理常式,除非例外狀況是整數或浮點溢位。如果是的話,這個處理常式會呼叫函式 (ResetVars僅為範例,沒有一個 API 函式) 以重設某些全域變數。陳述式區塊 2,在此範例空的可以永遠不會執行,因為Eval_Exception不會傳回 EXCEPTION_EXECUTE_HANDLER (1)。
使用函式呼叫是很好的通用技巧,以因應複雜的篩選條件運算式。兩個其他有用的 c 語言功能如下:
條件運算子
逗號運算子
條件運算子是經常是很有用,因為它可以用來檢查有特定的傳回碼,然後再將其中兩個不同的值。比方說,下列程式碼中的篩選條件識別例外狀況的例外狀況時,才STATUS_INTEGER_OVERFLOW:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
條件運算子的目的在此情況下是主要是提供清楚起見,因為下列的程式碼會產生相同的結果:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
條件運算子是在您可能想要評估為 – 1,EXCEPTION_CONTINUE_EXECUTION 的篩選條件的情況下更有用。
逗號運算子可讓您執行多重、 獨立的作業,在單一運算式。效果是大致上執行多個陳述式,然後傳回最後一個運算式的值。比方說,下列程式碼會儲存在變數中的例外狀況的程式碼,然後進行測試:
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )