Aracılığıyla paylaş


try-finally beyanat

deyimitry-finally, C ve C++ dillerinde yapılandırılmış özel durum işlemeyi destekleyen Microsoft'a özgü bir uzantıdır.

Sözdizimi

Aşağıdaki söz diziminde try-finally deyimi açıklanmaktadır:

    // . . .
    __try {
        // guarded code
    }
    __finally {
        // termination code
    }
    // . . .

Dilbilgisi

try-finally-statement:
__try compound-statement __finally compound-statement

deyimi try-finally , hedef uygulamaların bir kod bloğunun yürütülmesi kesildiğinde temizleme kodunun yürütülmesini garanti altına almasını sağlayan C ve C++ dillerine yönelik bir Microsoft uzantısıdır. Temizleme, belleği serbest bırakma, dosyaları kapatma ve dosya tanıtıcılarını serbest bırakma gibi görevlerden oluşur. deyimi try-finally , özellikle rutinden erken dönüşe neden olabilecek bir hata için denetim yapılan birkaç yere sahip yordamlar için yararlıdır.

İlgili bilgiler ve kod örneği için bkz try-except . Deyim. Genel olarak yapılandırılmış özel durum işleme hakkında daha fazla bilgi için bkz . Yapılandırılmış Özel Durum İşleme. C++/CLI ile yönetilen uygulamalarda özel durumları işleme hakkında daha fazla bilgi için, altında /clrÖzel Durum İşleme bölümüne bakın.

Not

Yapılandırılmış özel durum işlemi, hem C hem de C++ kaynak dosyaları için Win32 ile çalışır. Ancak, özellikle C++ için tasarlanmamıştır. C++ özel durum işlemeyi kullanarak kodunuzun daha taşınabilir olduğundan emin olabilirsiniz. Ayrıca, C++ özel durum işleme her türden özel durumu işleyebildiği için daha esnektir. C++ programları için C++ özel durum işleme mekanizmasını (try, catchve throw deyimlerini) kullanmanız önerilir.

Yan tümceden __try sonraki bileşik deyim korunan bölümdür. Yan tümcesinden __finally sonraki bileşik deyim sonlandırma işleyicisidir. İşleyici, korunan bölümden çıkıldığında, korunan bölümden bir özel durumla (anormal sonlandırma) veya standart düşüşle (normal sonlandırma) çıkıldığında yürütülen bir eylem kümesini belirtir.

Denetim, basit sıralı yürütme (fall through) ile bir __try deyime ulaşır. Denetim içine girdiğinde __try, ilişkili işleyicisi etkin hale gelir. Denetim akışı deneme bloğunun sonuna ulaşırsa yürütme aşağıdaki gibi devam eder:

  1. Sonlandırma işleyicisi çağrılır.

  2. Sonlandırma işleyicisi tamamlandığında, yürütme deyiminden __finally sonra devam eder. Ancak korunan bölüm sona erer (örneğin, korunan gövdenin dışından goto veya bir return deyimle), denetim akışı korunan bölümden çıkmadan önce sonlandırma işleyicisi yürütülür.

    Deyimi __finally uygun bir özel durum işleyicisi aramayı engellemez.

Blokta __try bir özel durum oluşursa, işletim sisteminin özel durum için bir işleyici bulması gerekir, aksi takdirde program başarısız olur. bir işleyici bulunursa, tüm ve tüm __finally bloklar yürütülür ve yürütme işleyicide sürdürülür.

Örneğin, aşağıdaki şekilde gösterildiği gibi, bir dizi işlevin D işlevi için A işlevini çağırarak bağlantı işlevini çağıracağını varsayalım. Her işlevin bir sonlandırma işleyicisi vardır. D işlevinde bir özel durum oluşturulur ve A'da işlenirse, sistem yığını çözebileceğinden sonlandırma işleyicileri şu sırayla çağrılır: D, C, B.

Sonlandırma işleyicisi yürütme sırasının diyagramı.

Diyagram, C işlevini çağıran ve D işlevini çağıran B işlevini çağıran A işleviyle başlar. D İşlevi bir özel durum oluşturur. Sonlandırma işleyicileri şu sırayla çağrılır: D'nin sonlandırma işleyicisi, ardından C'ler, B'ler ve ardından A özel durumu işler.

Sonlandırma işleyicisi yürütme sırası

Not

try-finally davranışı, C# gibi kullanımını destekleyen diğer bazı dillerden finallyfarklıdır. Tek __try bir tanesinde hem hem __exceptde her ikisi __finally birden olmayabilir. Her ikisi de birlikte kullanılacaksa, dış try-except deyimi iç try-finally deyimini içine almalıdır. Her bloğun ne zaman yürütüleceğini belirten kurallar da farklıdır.

Derleyici seçeneği/Za (Dil uzantılarını devre dışı bırak) belirtilmediği sürece, , ve önceki sürümleriyle _finally_try_leave uyumluluk için __try, __finally, ve __leave eş anlamlılarıdır.

__leave Anahtar Sözcüğü

__leave anahtar sözcüğü yalnızca bir try-finally deyimin korunan bölümünde geçerlidir ve bunun etkisi korunan bölümün sonuna atlamaktır. Yürütme, sonlandırma işleyicisindeki ilk deyimde devam eder.

Bir goto deyim de korunan bölümden atlayabilir, ancak yığın geri sarmayı çağırdığı için performansı düşürür. __leave Deyimi daha verimlidir çünkü yığın geri sarmaya neden olmaz.

Anormal Sonlandırma

longjmp çalışma zamanı işlevini kullanarak bir try-finally deyimden çıkmak anormal sonlandırma olarak kabul edilir. Bir ifadeye atlamak __try yasal değildir, ama bir ifadeden atlamak yasaldır. Kalkış noktası (bloğun normal sonlandırması__try) ile hedef (__exceptözel durumu işleyen blok) arasında etkin olan tüm __finally deyimler çalıştırılmalıdır. Buna yerel rahatlama denir.

__try Blok, bloğun dışına atlama da dahil olmak üzere herhangi bir nedenle erken sonlandırılırsa, sistem yığını geri sarma işleminin bir parçası olarak ilişkili __finally bloğu yürütür. Bu gibi durumlarda işlev, AbnormalTermination bloğun __finally içinden çağrılırsa döndürürtrue; aksi takdirde döndürürfalse.

Bir işlem bir deyimi yürütmenin try-finally ortasında sonlandırılırsa sonlandırma işleyicisi çağrılmaz.

END Microsoft'a özgü

Ayrıca bkz.

Sonlandırma işleyicisi yazma
Yapılandırılmış Özel Durum İşleme (C/C++)
Anahtar Sözcükler
Sonlandırma işleyicisi söz dizimi