Aracılığıyla paylaş


try-except beyanat

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

    // . . .
    __try {
        // guarded code
    }
    __except ( /* filter expression */ ) {
        // termination code
    }
    // . . .

Dilbilgisi

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

Açıklamalar

deyimi try-except , C ve C++ dillerine yönelik bir Microsoft uzantısıdır. Hedef uygulamaların normalde program yürütmeyi sonlandıran olaylar gerçekleştiğinde denetim elde etmelerini sağlar. Bu tür olaylara yapılandırılmış özel durumlar veya kısaca özel durumlar denir. Bu özel durumlarla ilgilenen mekanizma, yapılandırılmış özel durum işleme (SEH) olarak adlandırılır.

İlgili bilgiler için try-finally deyimine bakın.

Özel durumlar donanım tabanlı veya yazılım tabanlı olabilir. Yapılandırılmış özel durum işleme, uygulamalar donanım veya yazılım özel durumlarından tamamen kurtarılamasa bile kullanışlıdır. SEH, hata bilgilerini görüntülemeyi ve sorunu tanılamaya yardımcı olmak için uygulamanın iç durumunu yakalamayı mümkün kılar. Özellikle yeniden oluşturması kolay olmayan aralıklı sorunlar için kullanışlıdır.

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 yerel C++ özel durum işlemeyi kullanmanızı öneririz: try, catch ve throw deyimleri.

Yan tümceden __try sonraki bileşik deyim gövde veya korunan bölümdür. İfade__except, filtre ifadesi olarak da bilinir. Değeri, özel durumun nasıl işleneceğini belirler. __except yan tümcesinden sonra gelen bileşik deyim, özel durum işleyicisidir. İşleyici, gövde bölümünün yürütülmesi sırasında bir özel durum oluşursa yapılması gereken eylemleri 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. Üç olası değer vardır:

    • EXCEPTION_CONTINUE_EXECUTION (-1) Özel durum kapatılır. Yürütmeye, özel durumun gerçekleştiği noktadan devam edin.

    • EXCEPTION_CONTINUE_SEARCH (0) Ö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_EXECUTE_HANDLER (1) Özel durum tanındı. Bileşik deyimini yürüterek denetimi özel durum işleyicisine aktarın __except , ardından blok sonrasında yürütmeye devam edin __except .

İfade __except bir C ifadesi olarak değerlendirilir. 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.

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

Bir deyime atlamak geçerli değildir, ancak bir __try deyiminden atlamak için geçerlidir. Bir işlem bir deyimi yürütmenin try-except ortasında sonlandırılırsa özel durum işleyicisi çağrılmaz.

Derleyici seçeneği /Za (Dil uzantılarını devre dışı bırak) belirtilmediği sürece, önceki sürümlerle uyumluluk için __try_try, _except ve _leave , __exceptve __leave için eş anlamlıdır.

__leave anahtar sözcüğü

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

Deyimi goto korunan bölümden de atlayabilir ve try-finally deyiminde olduğu gibi performansı düşürmez. Bunun nedeni yığın geri sarmanın gerçekleşmemesidir. Ancak, deyimi yerine goto anahtar sözcüğünü __leave kullanmanızı öneririz. Bunun nedeni, korunan bölümün büyük veya karmaşık olması durumunda programlama hatası yapma olasılığınız düşük olmasıdır.

Yapılandırılmış özel durum işleme iç işlevleri

Yapılandırılmış özel durum işleme, deyimiyle try-except birlikte kullanılabilecek iki iç işlev sağlar: GetExceptionCode ve GetExceptionInformation.

GetExceptionCode özel durumun kodunu (32 bit tamsayı) döndürür.

İç işlevGetExceptionInformation, özel durum hakkında ek bilgiler içeren bir EXCEPTION_POINTERS yapısına yönelik bir işaretçi döndürür. Bu işaretçiyle, donanım özel durumu sırasında var olan makine durumuna erişebilirsiniz. Yapı aşağıdaki gibidir:

typedef struct _EXCEPTION_POINTERS {
    PEXCEPTION_RECORD ExceptionRecord;
    PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

İşaretçi türleri PEXCEPTION_RECORD ve PCONTEXT ekleme winnt.h> dosyasında <tanımlanır ve _EXCEPTION_RECORD _CONTEXT excpt.h ekleme dosyasında <tanımlanır>

Özel durum işleyicisi içinde kullanabilirsiniz GetExceptionCode . Ancak, yalnızca özel durum filtresi ifadesi içinde kullanabilirsiniz GetExceptionInformation . İşaret ettiği bilgiler genellikle yığındadır ve denetim özel durum işleyicisine aktarıldığında artık kullanılamaz.

İç işlevi AbnormalTermination bir sonlandırma işleyicisi içinde kullanılabilir. Try-finally deyiminin gövdesi sırayla sonlandırırsa 0 döndürür. Diğer tüm durumlarda, 1 döndürür.

<excpt.h> , bu iç değerler için bazı alternatif adlar tanımlar:

GetExceptionCode eşdeğerdir _exception_code

GetExceptionInformation eşdeğerdir _exception_info

AbnormalTermination eşdeğerdir _abnormal_termination

Ö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

Ayrıca bkz.

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