Yapılandırılmış Özel Durum İşleme (C/C++)
Yapılandırılmış özel durum işleme (SEH), donanım hataları gibi bazı olağanüstü kod durumlarını uygun şekilde işlemek için C'ye bir Microsoft uzantısıdır. Microsoft Windows ve Microsoft C++ SEH'yi desteklese de, ISO standardı C++ özel durum işlemeyi öneririz. Kodunuzu daha taşınabilir ve esnek hale getirir. Ancak, mevcut kodu veya belirli türlerde programları korumak için yine de SEH'i kullanmak zorunda kaldınız.
Microsoft'a özgü:
Dilbilgisi
try-except-statement:
__trycompound-statement__except(expression)compound-statement
try-finally-statement:
__trycompound-statement__finallycompound-statement
Açıklamalar
SEH ile, bellek blokları ve dosyalar gibi kaynakların, yürütme beklenmedik şekilde sonlandırılırsa doğru şekilde serbest bırakıldıklarının emin olun. Belirli sorunları (örneğin yetersiz bellek) deyimleri kullanmayan kısa yapılandırılmış kod kullanarak veya dönüş kodlarının ayrıntılı testlerini kullanarak goto da işebilirsiniz.
Bu try-excepttry-finally makalede başvurulan ve deyimleri, C dilinin Microsoft uzantılarıdır. Uygulamaların, aksi takdirde yürütmeyi sonlandıran olaylar sonrasında bir programın denetimine sahip olacak şekilde SEH'i destekler. SEH, C++ kaynak dosyalarıyla birlikte çalışıyor olsa da, özellikle C++ için tasarlanmamalıdır. veya seçeneğini kullanarak derleye bir C++ programında /EHsc SEH kullanırsanız, yerel nesneler için yok etmeler çağrılır, ancak diğer yürütme davranışı beklediğiniz gibi olmayacaktır. Çizim için bu makalenin devamlarında yer alan örneğine bakın. Çoğu durumda, SEH yerine Microsoft C++ derleyicisi tarafından da destekleyen ISO standardı C++özel durum işlemesi kullanılması önerilir. C++ özel durum işlemeyi kullanarak kodunuzun daha taşınabilir olduğundan ve herhangi bir tür özel durumlarını işleyebilirsiniz.
SEH kullanan C kodunuz varsa, C++ özel durum işleme kullanan C++ koduyla karıştırabilirsiniz. Bilgi için bkz. C++ içinde yapılandırılmış özel durumları işleme.
İki SEH mekanizması vardır:
Özel durum işleyicileri , veya blokları; bu işleyiciler özel durumlara yanıt verir veya özel durumu reddeder.
Bir özel durumun sonlandırmayaneden olup olmadığı her zaman çağrılan sonlandırma işleyicileri veya blokları.
Bu iki işleyici türü farklıdır, ancak yığını geriye doğru izleme olarak bilinen bir işlemle yakından ilişkilidir. Yapılandırılmış bir özel durum oluştuğunda, Windows etkin olan en son yüklenmiş özel durum işleyicisi için bir görünüme sahip olur. İşleyici üç şeyden birini yapar:
Özel durumu tanıyamıyorum ve denetimi diğer işleyicilere iletir.
Özel durumu tanıyın ancak bunu yok sayarak.
Özel durumu tanıma ve işleme.
Özel durumu tanıyan özel durum işleyicisi, özel durum meydana geldiğinde çalışan işlevde yer almaktadır. Yığında çok daha yüksek bir işlevde olabilir. O 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ın ikilesi olur. Başka bir ifadeyle, sonlandırılan işlevlerin yerel statik olmayan değişkenleri yığından temiz olur.
Yığını geriye doğru ilerlerken, işletim sistemi her işlev için sizin yazmış olduğunu sonlandırma işleyicilerini çağırıyor. Sonlandırma işleyicisi kullanarak, anormal sonlandırma nedeniyle açık kalacak kaynakları temizlersiniz. Kritik bir bölüm girdiyebilirsiniz, sonlandırma işleyicisinde bu bölümden çıkabilirsiniz. Program kapatacaksa, geçici dosyaları kapatma ve kaldırma gibi diğer bakım görevlerini gerçekleştirebilirsiniz.
Sonraki adımlar
Örnek
Daha önce belirtildiği gibi, bir C++ programında SEH kullanırsanız ve veya seçeneğini kullanarak derlerseniz yerel nesnelere yönelik /EHa yıkıcılar /EHsc çağrılır. Ancak, C++ özel durumlarını da kullanıyorsanız yürütme sırasındaki davranış beklediğiniz gibi olabilir. Bu örnek, bu davranış farklılıklarını gösteriyor.
#include <stdio.h>
#include <Windows.h>
#include <exception>
class TestClass
{
public:
~TestClass()
{
printf("Destroying TestClass!\r\n");
}
};
__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
printf("Throwing C++ exception\r\n");
throw std::exception("");
#else
printf("Triggering SEH exception\r\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\r\n");
}
return 0;
}
Bu kodu derlemek için kullanırsanız ancak yerel test denetimi makrosu tanımlanmamışsa /EHscCPPEX yıkıcı TestClass çalıştırmaz. Çıktı şuna benzer:
Triggering SEH exception
Executing SEH __except block
Kodu derlemek için kullanırsanız ve /EHscCPPEX kullanılarak /DCPPEX tanımlanırsa (C++ özel durumu oluşturması için), yıkıcı çalışır ve TestClass çıktı şöyle olur:
Throwing C++ exception
Destroying TestClass!
Executing SEH __except block
Kodu derlemek için kullanırsanız, yıkıcı özel durumun kullanılarak mı yoksa özel durumu tetiklemek için SEH kullanılarak mı /EHaTestClass at edildiğini std::throw yürütür. Başka bir ifadeyle CPPEX tanımlansa da tanımlansa da tanımlansa da değildir. Çıktı şuna benzer:
Throwing C++ exception
Destroying TestClass!
Executing SEH __except block
Daha fazla bilgi için bkz. (Özel Durum İşleme Modeli).
END Microsoft'a özgü
Ayrıca bkz.
Özel durum işleme
Anahtar sözcükler
<exception>
Hatalar ve özel durum işleme
Yapılandırılmış Özel Durum İşleme (Windows)