Aracılığıyla paylaş


try-except deyimi (C)

Microsoft'a özgü

try-except deyimi, normalde yürütmeyi sonlandıran olaylar gerçekleştiğinde uygulamaların bir programın denetimini almasına olanak tanıyan bir C dilinin Microsoft uzantısıdır. Böyle olaylara özel durumlar, özel durumlarla uğraşan mekanizmaya ise yapılandırılmış özel durum işleme adı verilir.

Özel durumlar donanım veya yazılım tabanlı olabilir. Uygulamalar donanım veya yazılım özel durumlarından tamamen kurtulamasa bile, yapılandırılmış özel durum işleme hata bilgilerini günlüğe kaydetmeyi ve görüntülemeyi mümkün kılar. Sorunu tanılamaya yardımcı olmak için uygulamanın iç durumunu yakalamak yararlı olur. Özellikle, yeniden oluşturması kolay olmayan aralıklı sorunlar için yararlıdır.

Sözdizimi

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Yan tümceden __try sonraki bileşik deyim korunan bölümdür. Yan tümceden __except sonraki bileşik deyim özel durum işleyicidir. İşleyici, korunan bölümün yürütülmesi sırasında bir özel durum oluşursa yapılması gereken eylemler kümesini belirtir. Yürütme aşağıdaki gibi devam eder:

  1. Korunan bölüm yürütülür.

  2. Korunan bölümün yürütülmesi sırasında hiçbir özel durum gerçekleşmezse, yürütme işlemine __except yan tümcesinden sonra deyimde devam edilir.

  3. Korunan bölümün yürütülmesi sırasında veya korunan bölümün çağırıldığı herhangi bir yordamda bir özel durum oluşursa, __except ifade değerlendirilir. Döndürülen değer, özel durumun nasıl işleneceğini belirler. Üç olası değer vardır:

    • EXCEPTION_CONTINUE_SEARCH: Özel durum tanınmıyor. Önce deyimleri içeren try-except , ardından sonraki en yüksek önceliğe sahip işleyiciler için bir işleyici için yığında aramaya devam edin.

    • EXCEPTION_CONTINUE_EXECUTION: Özel durum tanınır ancak kapatılır. Yürütmeye, özel durumun gerçekleştiği noktadan devam edin.

    • EXCEPTION_EXECUTE_HANDLER Özel durum tanındı. Bileşik deyimini yürüterek denetimi özel durum işleyicisine aktarın __except , ardından özel durumun oluştuğu noktada yürütmeye devam edin.

İfade bir C ifadesi olarak değerlendirildiğinden __except , tek bir değerle, koşullu ifade işleciyle veya virgül işleciyle sınırlıdır. Daha kapsamlı bir işlem gerekliyse, ifade yukarıda listelenen üç değerden birini döndüren bir yordam çağırabilir.

Not

Yapılandırılmış özel durum işleme C ve C++ kaynak dosyalarıyla çalışır. Ancak, özellikle C++ için tasarlanmamıştır. Taşınabilir C++ programları için yapılandırılmış özel durum işleme yerine C++ özel durum işleme kullanılmalıdır. Ayrıca, C++ özel durum işleme mekanizması, herhangi bir türdeki özel durumları işleyebildiği için çok daha esnektir. Daha fazla bilgi için bkz. C++ Dil Başvurusu'nda özel durum işleme.

Bir uygulamadaki her yordamın kendi özel durum işleyicisi olabilir. İfade, __except gövde kapsamında __try yürütülür. Burada bildirilen tüm yerel değişkenlere erişimi vardır.

anahtar __leave sözcüğü bir try-except deyim bloğu içinde geçerlidir. etkisi __leave bloğun sonuna atlamaktır try-except . Yürütme, özel durum işleyicisi sona erdikten sonra devam eder. Bir deyimi aynı sonucu elde etmek için kullanılabilse de goto , deyimi goto yığın geri sarmaya neden olur. __leave Deyimi, yığın geri sarmayı içermediğinden daha verimlidir.

Çalışma zamanı işlevini kullanarak bir try-except deyimden longjmp çıkmak anormal sonlandırma olarak kabul edilir. Bir ifadeye atlamak __try yasal değildir, ama bir ifadeden atlamak yasaldır. Bir işlem bir deyimi yürütmenin try-except ortasında sonlandırılırsa özel durum işleyicisi çağrılmaz.

Örnek

Burada bir özel durum işleyicisi ve sonlandırma işleyicisi örneği verilmiş. Sonlandırma işleyicileri hakkında daha fazla bilgi için bkz try-finally . deyim (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Aşağıda örnekten alınan ve sağ tarafta açıklama eklenmiş olan çıkış verilmişti:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

END Microsoft'a özgü

Ayrıca bkz.

try-except deyimi (C++)