共用方式為


例外狀況規格

例外狀況規格是 C++. 圖表 C++0x 已被取代的語言功能。 它們是用來提供關於例外狀況的摘要資訊可以擲回在函式之外,,但實際上會發現它們有問題。 識別一些有用的其中一個例外狀況規格是 throw() 規格。 例如:

void MyFunction(int i) throw();

指示編譯器函式不會擲回任何例外狀況。 它相當於使用 declspec(nothrow)。 它的用途是選擇項。 在 C++0x,引入 noexcept 運算子,不過,支援這個功能不會出現在 Visual C++ 自 Visual Studio 2012。

Visual C++ 保持為自己的例外狀況規格之實作的 ANSI 標準。 下表摘要說明例外狀況規格的 Visual C++ 實作:

例外狀況規格

意義

throw()

函式並不會擲回例外狀況。 不過,在中,如果擲回例外狀況在函式標記為 throw() 之外, Visual C++ 編譯器不會呼叫未預期 (請參閱 unexpected (CRT)unexpected (<exception>) 以取得詳細資訊)。 如果此函式標記為 throw(), Visual C++ 編譯器會假設,函式就會擲回 C++ 例外狀況 (Exception) 並且據此產生程式碼。 可能是由於 C++ 編譯器執行的最佳化程式碼 (依據假設函式不擲回 C++ 例外狀況),如果函式擲回例外狀況,程式可能無法正確執行。

擲回 (...)

函式會擲回例外狀況。

擲回 (type)

函式可以擲回型別 type的例外狀況。 不過,在 Visual C++ .NET 中,此值會解譯為擲回 (...)。 請參閱 函式例外狀況規範

如果例外狀況處理應用程式中,必須有處理擲回之例外狀況的一或多個函式。 所有函式會在擲回例外狀況 (Exception) 和該處理例外狀況的執行個體之間必須能在擲回例外狀況。

函式擲回行為會取決於下列因素:

  • 您是否已編譯函式以 C 或 C++ 中。

  • /EH 編譯器選項使用。

  • 您是否明確指定例外狀況規格。

明確的例外狀況規格在 C 函式不允許的。

下表彙總函式擲回行為:

Function

/EHsc

/EHs

/EHa

/EHac

C 函式

throw()

擲回 (...)

擲回 (...)

擲回 (...)

沒有例外狀況規格的 C++ 函式

擲回 (...)

擲回 (...)

擲回 (...)

擲回 (...)

使用會 throw() 例外狀況規格的 C++ 函式

throw()

throw()

擲回 (...)

擲回 (...)

與 throw(...) 例外狀況規格的 C++ 函式

擲回 (...)

擲回 (...)

擲回 (...)

擲回 (...)

與擲回 (type) 例外狀況規格的 C++ 函式

擲回 (...)

擲回 (...)

擲回 (...)

擲回 (...)

範例

// exception_specification.cpp
// compile with: /EHs
#include <stdio.h>

void handler() {
   printf_s("in handler\n");
}

void f1(void) throw(int) {
   printf_s("About to throw 1\n");
   if (1)
      throw 1;
}

void f5(void) throw() {
   try {
      f1();
   }
   catch(...) {
      handler();
    }
}

// invalid, doesn't handle the int exception thrown from f1()
// void f3(void) throw() {
//   f1();
// }

void __declspec(nothrow) f2(void) {
   try {
      f1();
   }
   catch(int) {
      handler();
    }
}

// only valid if compiled without /EHc 
// /EHc means assume extern "C" functions don't throw exceptions
extern "C" void f4(void);
void f4(void) {
   f1();
}

int main() {
   f2();

   try {
      f4();
   }
   catch(...) {
      printf_s("Caught exception from f4\n");
   }
   f5();
}
  

請參閱

參考

請試著、 攔截,並擲回的陳述式 (C++)

C + + 例外處理