Aracılığıyla paylaş


Özel durum belirtimleri

Özel durum belirtimleri c itiraz C++ dili özelliği olan ++ 0 x. Hangi özel durumlar dışında bir işlev atılabilen hakkında özet bilgi sağlamak için tasarlanmış, ancak pratikte bunlar sorunlu bulundu. Throw() belirtimi biraz yararlı kanıtlamak tek özel durum belirtimi idi. Örne?in:

void MyFunction(int i) throw();

Derleyicinin işlevini herhangi bir istisna atacak değil söyler. Kullanmaya eşdeğerdir __declspec(nothrow). Kullanımı isteğe bağlı olarak kabul edilir. C ++ 0 x noexcept işleci sunulan, ancak bu özellik henüz Visual Studio 2012 itibariyle Visual C++'ta yok desteği.

Özel durum belirtiminin uygulaması ANSI standart gelen Visual C++ departs. Visual C++ uygulaması özel durumu özellikleri aşağıdaki tabloda özetlenmiştir:

Özel durum belirtimi

Anlam

throw()

İşlev bir istisna değildir. Throw() olarak işaretlenmiş bir işlev dışında bir özel durum oluşursa, Bununla birlikte, Visual C++ derleyicisi beklenmeyen çağırmayacaktır (bkz: unexpected (CRT) ve unexpected (<exception>) daha fazla bilgi için). Bir işlev throw() ile işaretlenmişse, Visual C++ derleyicisi işlevi değil C++ istisna atar ve kodu buna göre oluşturduğunu varsayın. (İşlev herhangi bir C++ istisna atacak değil varsayımına göre) C++ Derleyici tarafından gerçekleştirilen kod iyileştirmeler nedeniyle bir işlev istisna, program doğru yürütülemeyebilir.

throw(...)

İşlev bir istisna.

throw(type)

İşlev türü istisna type. Bununla birlikte, Visual C++ .net bunu throw(...) yorumlanır. Bkz: işlevi özel durum belirticileri.

Özel durum işlemenin bir uygulamada kullanılan thrown özel durumlarý iþlemek bir veya daha fazla işlev olmalıdır. Adı verilen bir istisna atar bir özel durum işleme biri arasında herhangi bir işlev özel durum üretiliyor yeteneğinin olması gerekir.

Bir işlevin throw davranış aşağıdaki etkenlere bağlıdır:

  • Olup c veya C++ altında fonksiyon derleme.

  • Hangi /eh derleyici seçeneğini kullanırsınız.

  • Olup olmadığını açıkça özel durum belirtimi belirtin.

Açık özel durum belirtimleri c işlevlerine izin verilmez.

Aşağıdaki tabloda, bir işlev throw davranışını özetler:

İşlev

/ EHsc

/ EHs

/ EHa

/ EHac

C işlevi

throw()

throw(...)

throw(...)

throw(...)

C++ işleviyle hiçbir özel durum belirtimi

throw(...)

throw(...)

throw(...)

throw(...)

Throw() özel durum belirtimi ile C++ işlevi

throw()

throw()

throw(...)

throw(...)

Throw(...) özel durum belirtimi ile C++ işlevi

throw(...)

throw(...)

throw(...)

throw(...)

C++ işleviyle throw (type) özel durum belirtimi

throw(...)

throw(...)

throw(...)

throw(...)

Örnek

// 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();
}
  

Ayrıca bkz.

Başvuru

deneyin, catch ve throw ifadelerini (C++)

C++ özel durum işleme