Aracılığıyla paylaş


deneyin-ifadesi hariç

Microsoft özel

Bir try aşağıdaki sözdizimini açıklar-hariç ifadesi:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Notlar

Deneyin-dışında c Microsoft uzantısı ifadesidir ve hedef uygulamaların kazanç sağlayan C++ dilleri kontrol normalde program yürütme sona erdirmek olaylar olduğunda.Bu tür olayların özel durumlar verilir ve özel durumları ile ilgilenir mekanizması yapılandırılmış özel durum işleme denir.

İlgili bilgi için bkz: try-finally deyimi.

Özel durumlar, donanım veya yazılım tabanlı olabilir.Hatta donanım veya yazılım özel durumlar uygulamalar tamamen kurtaramazsınız, yapılandırılmış özel durum işleme hata bilgilerini görüntülemek ve iç sorunu tanılamak üzere uygulama durumunu yakalamak sağlar.Bu kolayca üretilemeyen aralıklı sorunlar için özellikle yararlıdır.

[!NOT]

c ve C++ kaynak dosyalarını için Win32 ile çalışır işleme yapılandırılmış özel durum.Ancak, özellikle C++ için tasarlanmamıştır.C++ özel durum işleme kullanarak, kodunuzun daha taşınabilir olduğunu emin olabilirsiniz.Ayrıca, C++ özel durum işlemenin daha esnek özel durumlar her türlü işleyebilir olmamasıdır.C++ programları için C++ özel durum işleme mekanizmasını kullanmanız önerilir (deneyin ve catch, throw ifadeleri).

Sonra bileşik deyim __try yan tümcesinin gövde veya guarded bölüm.Sonra bileşik deyim __except yan tümcesinin özel durum işleyicisi.İşleyici bir dizi guarded bölümün gövde yürütme sırasında bir özel durum ortaya çıkar, gerçekleştirilecek eylemi belirtir.Yürütme gibi çalışır:

  1. Guarded bölümü çalıştırılır.

  2. Guarded bölüm yürütme sırasında hiçbir özel durum ortaya çıkarsa, deyiminin hemen sonrasına at yürütme devam __except yan tümcesi.

  3. Guarded bölüm yürütme sırasında bir özel durum oluşur veya guarded bölümüne herhangi bir yordamı çağırır, __exceptifade (adlı filtre ifade) değerlendirilir ve özel durum nasıl işlendiğini belirler. Üç değer vardır:

    EXCEPTION_CONTINUE_EXECUTION (–1) özel durum atlamamış.Özel durumun oluştuğu noktayı yürütülmesine devam.

    EXCEPTION_CONTINUE_SEARCH (0) özel durum tanınmıyor.Bir işleyici için yığın yukarı ilk bulunduğu için aramaya devam edip deneyin-dışında sonra sonraki en yüksek önceliğe sahip işleyicileri için deyimleri.

    EXCEPTION_EXECUTE_HANDLER (1) istisna tanınmasını.Denetim için özel durum işleyici yürüterek transfer __except bileşik ifade ve yürütme sonrasında devam __except blok.

Çünkü __dışında ifade c bir ifade olarak değerlendirilir, tek bir değer, koşullu ifade işleci veya virgül operatörünü sınırlıdır.Daha kapsamlı işlenmesi gerekirse, yukarıda listelenen üç değerden birini veren bir yordam ifade çağırabilirsiniz.

Her uygulamanın kendi özel durum işleyici olabilir.

İçine atlamak için geçerli değil bir __try ancak bir yöneticiyi atlamak için geçerli bir ifade.Özel durum işleyicisi yürütülürken ortasında bir işlemi sona erdiğinde çağrılmaz bir deneyin-dışında ifadesi.

Bilgi Bankası makalesi Q315937 daha fazla bilgi için bkz: nasıl yapılır: yığın taşma tuzağı bir Visual C++ uygulamasında.

Anahtar sözcük __leave

__leave Anahtar sözcüğü, sadece guarded bölümünü içinde geçerli bir try-except deyimi ve etkisi olduğu guarded bölümün sonuna atlamak için.Yürütme sırasında özel durum işleyicisi ilk bildiri devam eder.

A goto ifadesi de guarded bölümüne atlama ve bunu yapar gibi performans azalmaz bir try-finally deyimi yığın unwinding oluşmaz çünkü.Ancak, kullanmanızı öneririz __leave anahtar sözcük yerine bir goto deyimi guarded bölüm büyük veya karmaşık bir programlama hataları olun olasılığı daha azdır, çünkü.

s58ftw19.collapse_all(tr-tr,VS.110).gifYapılandırılmış özel durum işleme iç işlevleri

Yapılandırılmış özel durum işleme ile kullanmak kullanılabilir olan iki iç işlevlerini sağlar deneyin-dışında ifadesi: GetExceptionCode ve GetExceptionInformation.

GetExceptionCode özel durum kodunu (32-bit bir tamsayı) döndürür.

İç işlev GetExceptionInformation özel durum hakkında ek bilgi içeren bir yapı için bir işaretçi döndürür.Bu işaretçi donanım özel durum sırasında vardı makine durumu erişebilirsiniz.Yapısı aşağıdaki gibidir:

struct _EXCEPTION_POINTERS {
      EXCEPTION_RECORD *ExceptionRecord,
      CONTEXT *ContextRecord }

İşaretçi türleri _EXCEPTION_RECORD ve _İçerik excpt içerme dosyasında tanımlanır.H.

Kullanabileceğiniz GetExceptionCode özel durum işleyicisi içinde.Ancak, kullanabileceğiniz GetExceptionInformation yalnızca özel filtre ifadesi içinde.İşaret bilgiler genellikle yığında ve denetim için özel durum işleyici transfer edildiğinde artık kullanılamıyor.

İç işlev AbnormalTermination sonlandırma işleyicisi içinde kullanılabilir.Değilse 0 döndürür gövdesi try-finally deyimi sırayla sona erer.Diğer tüm durumlarda, 1 değerini döndürür.

EXCPT.H diğer bazı adlar için bu iç bilgileri tanımlar:

GetExceptionCode _exception_code için eşdeğerdir

GetExceptionInformation _exception_info için eşdeğerdir

AbnormalTermination _abnormal_termination için eşdeğerdir

Örnek

// exceptions_try_except_Statement.cpp

// Example of try-except and try-finally statements

#include <stdio.h>

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION

#include <excpt.h>

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {

   puts("in filter.");

   if (code == EXCEPTION_ACCESS_VIOLATION) {

      puts("caught AV as expected.");

      return EXCEPTION_EXECUTE_HANDLER;

   }

   else {

      puts("didn't catch AV, unexpected.");

      return EXCEPTION_CONTINUE_SEARCH;

   };

}

int main()

{

   int* p = 0x00000000;   // pointer to NULL

   puts("hello");

   __try{

      puts("in try");

      __try{

         puts("in try");

         *p = 13;    // causes an access violation exception;

      }__finally{

puts("in finally. termination: ");

puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");

      }

   }__except(filter(GetExceptionCode(), GetExceptionInformation())){

      puts("in except");

   }

   puts("world");

}

Çıktı

hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
        abnormal
in except
world

SON Microsoft özel

Ayrıca bkz.

Başvuru

Özel durum işleyici yazmak

Yapılandırılmış özel durum işleme (C++)

C++ anahtar sözcükler