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
, catch
ve 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:
Sonlandırma işleyicisi çağrılır.
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ışındangoto
veya birreturn
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.
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 finally
farklıdır. Tek __try
bir tanesinde hem hem __except
de 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin