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:
Korunan bölüm yürütülür.
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.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çerentry-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 , __except
ve __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
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