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:
Özel duruma yanıt verebilen veya değere göre özel durumu kapatabilen özel durum işleyicileri veya
__except
bloklarıfilter-expression
. Daha fazla bilgi için bkztry-except
. deyimi.Bir özel durumun sonlandırmaya neden olup olmadığına bakılmaksızın, her zaman çağrılan sonlandırma işleyicileri veya
__finally
bloklar. Daha fazla bilgi için bkztry-finally
. deyimi.
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)
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin