共用方式為


撰寫例外狀況篩選條件

您可以處理例外狀況,使其跳躍至例外狀況處理常式的層級,或繼續執行。 除了使用例外狀況處理常式程式碼來處理例外狀況,並下降,您可以使用篩選來清除問題然後傳回 – 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 )

請參閱

參考

撰寫例外處理常式

結構化的例外處理 (C++)