Yapılandırılmış Özel Durum İşleme (C/C++)

Yapılandırılmış özel durum işleme (SEH), donanım hataları gibi belirli olağanüstü kod durumlarını düzgün bir şekilde işlemek için C ve C++ için bir Microsoft uzantısıdır. Windows ve Microsoft C++ SEH'yi desteklese de, C++ kodunda ISO standart C++ özel durum işlemesini kullanmanızı öneririz. Kodunuzu daha taşınabilir ve esnek hale getirir. Ancak, mevcut kodu veya belirli program türlerini korumak için SEH'yi kullanmanız gerekebilir.

Microsoft'a özgü:

Dilbilgisi

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

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

Açıklamalar

SEH ile bellek blokları ve dosyalar gibi kaynakların, yürütme beklenmedik bir şekilde sonlandırılırsa doğru şekilde yayınlanmasını sağlayabilirsiniz. Deyimleri kullanmayan goto kısa yapılandırılmış kodu veya dönüş kodlarının ayrıntılı testini kullanarak belirli sorunları (yetersiz bellek gibi) de işleyebilirsiniz.

try-except Bu makalede başvurulan ve try-finally deyimleri, C ve C++ dillerine yönelik Microsoft uzantılarıdır. Aksi takdirde yürütmeyi sonlandıracak olaylardan sonra uygulamaların bir programın denetimini almasına olanak tanıyarak SEH'yi destekler. SEH, C++ kaynak dosyalarıyla çalışsa da, özellikle C++ için tasarlanmamıştır. veya /EHsc seçeneğini kullanarak /EHa derlediğiniz bir C++ programında SEH kullanıyorsanız, yerel nesneler için yıkıcılar çağrılır, ancak diğer yürütme davranışları beklediğiniz gibi olmayabilir. Çizim için bu makalenin devamında yer alan örne bakın. Çoğu durumda, SEH yerine ISO standart C++ özel durum işlemesini kullanmanızı öneririz. C++ özel durum işlemesini kullanarak kodunuzun daha taşınabilir olduğundan emin olabilir ve herhangi bir türde özel durumları işleyebilirsiniz.

SEH kullanan C kodunuz varsa, bunu C++ özel durum işleme kullanan C++ koduyla karıştırabilirsiniz. Bilgi için bkz . C++'da yapılandırılmış özel durumları işleme.

İki SEH mekanizması vardır:

Bu iki tür işleyici ayrıdır, ancak yığını geri sarma olarak bilinen bir işlemle yakından ilişkilidir. Yapılandırılmış bir özel durum oluştuğunda, Windows şu anda etkin olan en son yüklenen özel durum işleyicisini arar. İşleyici üç işlemden birini yapabilir:

  • Özel durumu tanıyamaz ve denetimi diğer işleyicilere (EXCEPTION_CONTINUE_SEARCH ) geçirir.

  • Özel durumu tanıyın ancak (EXCEPTION_CONTINUE_EXECUTION) kapatabilirsiniz.

  • Özel durumu tanıyın ve işleyebilir (EXCEPTION_EXECUTE_HANDLER).

Özel durumu tanıyan özel durum işleyicisi, özel durum oluştuğunda çalışan işlevde olmayabilir. Yığında çok daha yüksek bir işlevde olabilir. Şu anda çalışan işlev ve yığın çerçevesindeki diğer tüm işlevler sonlandırılır. Bu işlem sırasında yığın kaldırılır. Yani, sonlandırılan işlevlerin statik olmayan yerel değişkenleri yığından temizlenir.

yığınını çözdüğünüzde, işletim sistemi her işlev için yazdığınız sonlandırma işleyicilerini çağırır. Sonlandırma işleyicisi kullanarak, normal olmayan bir sonlandırma nedeniyle açık kalan kaynakları temizlersiniz. Kritik bir bölüm girdiyseniz sonlandırma işleyicisinde bu bölümden çıkabilirsiniz. Program kapatılırken, geçici dosyaları kapatma ve kaldırma gibi diğer temizlik görevlerini gerçekleştirebilirsiniz.

Sonraki adımlar

Örnek

Daha önce belirtildiği gibi, bir C++ programında SEH kullanıyorsanız ve veya /EHsc seçeneğini kullanarak derlediyseniz yerel nesneler için yıkıcılar çağrılır/EHa. Ancak, C++ özel durumlarını da kullanıyorsanız yürütme sırasındaki davranış beklediğiniz gibi olmayabilir. Bu örnekte bu davranış farklılıkları gösterilmektedir.

#include <stdio.h>
#include <Windows.h>
#include <exception>

class TestClass
{
public:
    ~TestClass()
    {
        printf("Destroying TestClass!\n");
    }
};

__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
    printf("Throwing C++ exception\n");
    throw std::exception("");
#else
    printf("Triggering SEH exception\n");
    volatile int *pInt = 0x00000000;
    *pInt = 20;
#endif
}

__declspec(noinline) void TestExceptions()
{
    TestClass d;
    TestCPPEX();
}

int main()
{
    __try
    {
        TestExceptions();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        printf("Executing SEH __except block\n");
    }

    return 0;
}

Bu kodu derlemek için kullanırsanız /EHsc ancak yerel test denetimi makrosu CPPEX tanımlanmamışsa, TestClass yıkıcı çalışmaz. Çıkış şöyle görünür:

Triggering SEH exception
Executing SEH __except block

Kodu derlemek için kullanırsanız /EHsc ve CPPEX kullanılarak /DCPPEX tanımlanırsa (böylece bir C++ özel durumu oluşturulur), TestClass yok edici çalışır ve çıkış şöyle görünür:

Throwing C++ exception
Destroying TestClass!
Executing SEH __except block

Kodu derlemek için kullanırsanız /EHa , TestClass yıkıcı bir özel durumun standart bir C++ throw ifadesi kullanılarak mı yoksa SEH kullanılarak mı oluşturulduğundan bağımsız olarak yürütülür. Yani tanımlanıp CPPEX tanımlanmadığı. Çıkış şöyle görünür:

Throwing C++ exception
Destroying TestClass!
Executing SEH __except block

Daha fazla bilgi için bkz /EH . (Özel Durum İşleme Modeli).

END Microsoft'a özgü

Ayrıca bkz.

Özel durumları işleme
Anahtar Sözcükler
<exception>
Hatalar ve özel durum işleme
Yapılandırılmış Özel Durum İşleme (Windows)