Aracılığıyla paylaş


Termination-Handler Söz Dizimi

sonlandırma işleyicisi oluşturmak için __try ve __finally anahtar sözcükleri kullanılır. Aşağıdaki örnekte sonlandırma işleyicisinin yapısı gösterilmektedir.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

Örnekler için bkz. Sonlandırma İşleyicisi Kullanma.

Özel durum işleyicisinde olduğu gibi, hem __try bloğu hem de __finally bloğu için ayraç ({}) gerekir ve iki bloğa atlamak için bir goto deyimi kullanılmasına izin verilmez.

__try bloğu, sonlandırma işleyicisi tarafından korunan korumalı kod gövdesini içerir. bir işlevin herhangi bir sayıda sonlandırma işleyicisi olabilir ve bu sonlandırma işleme blokları aynı işlev içinde veya farklı işlevlerde iç içe yerleştirilebilir.

__finally bloğu, denetim akışı __try bloğundan ayrıldığında yürütülür. Ancak, __try bloğunda aşağıdaki işlevlerden herhangi birini çağırırsanız __finally bloğu yürütülemez: ExitProcess, ExitThreadveya iptal.

__finally bloğu, sonlandırma işleyicisinin bulunduğu işlev bağlamında yürütülür. Bu, __finally bloğunun bu işlevin yerel değişkenlerine erişebileceği anlamına gelir. __finally bloğunun yürütülmesi aşağıdaki araçlardan herhangi biri tarafından sonlandırılabilir.

  • Bloktaki son deyimin yürütülmesi ve sonraki yönergeye devam edilmesi
  • Bir denetim deyiminin kullanımı (döndür , kesme, devam )
  • longjmp veya özel durum işleyicisine atlama kullanımı

__try bloğunun yürütülmesi, çerçeve tabanlı özel durum işleyicisinin özel durum işleme bloğunu çağıran bir özel durum nedeniyle sonlandırılırsa, özel durum işleme bloğu yürütülmeden önce __finally bloğu yürütülür. Benzer şekilde, __try bloğundan longjmp C çalışma zamanı kitaplığı işlevine yapılan bir çağrı, longjmp işleminin hedefinde yürütme sürdürülmeden önce __finally bloğunun yürütülmesine neden olur. __try blok yürütmesi bir denetim deyimi (döndür , kesme , devamveya ) nedeniyle sonlandırılırsa, __finally bloğu yürütülür.

AbnormalTermination işlevi, __try bloğunun sıralı olarak sonlandırılıp sonlandırılmadığını( yani kapanış ayracına (}) ulaşıp ulaşmadığını belirlemek için __finally bloğu içinde kullanılabilir. __try bloğunu longjmpçağrısı, özel durum işleyicisine atlama veya döndürerek kesmekesme, devam etme veya deyimine olması anormal bir sonlandırma olarak kabul edilir. Sıralı olarak sonlandırılamamasının, sistemin herhangi bir sonlandırma işleyicisinin çağrılıp çağrılmayacağını belirlemek için tüm yığın çerçevelerinde ters sırada aramasına neden olduğunu unutmayın. Bu, yüzlerce yönergenin yürütülmesi nedeniyle performans düşüşüyle sonuçlanabilir.

Sonlandırma işleyicisinin anormal sonlandırmasını önlemek için yürütme, bloğun sonuna kadar devam etmelidir. __leave deyimini de yürütebilirsiniz. __leave deyimi, anormal sonlandırmaya ve performans cezasına neden olmadan __try bloğunun hemen sonlandırılmasına olanak tanır. __leave deyiminin desteklenip desteklenmediğini belirlemek için derleyici belgelerinize bakın.

__finally bloğunun yürütülmesi, dönüş denetim deyimi nedeniyle sonlandırılırsa, kapsayan işlevdeki kapanış ayracına bir goto eşdeğerdir. Bu nedenle, kapsayan işlev döndürülecektir.