Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Aşağıdaki örneklerde özel durum işleyicisi kullanımı gösterilmektedir.
Örneklerden bazıları, işleyiciyi yürütmeden önce özel durum türünü denetlemek için __except filtre ifadesi içindeki GetExceptionCode işlevini kullanır. Bu, sistemin başka bir özel durum türü oluşursa uygun işleyiciyi aramaya devam etmelerini sağlar.
Genel olarak, yalnızca özel durum türü beklendiğinde ve hatalı adres bilindiğinde bir özel durum filtresinden EXCEPTION_EXECUTE_HANDLER döndürebilirsiniz. Varsayılan özel durum işleyicisinin beklenmeyen özel durum türlerini ve hatalı adresleri işlemesine izin vermelisiniz.
Örnek 1
Aşağıdaki kod parçası, iki 32 bit tamsayıdaki bölme işleminin sıfıra bölme hatasına neden olup olmayacağını denetlemek için yapılandırılmış özel durum işlemeyi kullanır. Bu durumda işlev YANLIŞ döndürür; aksi takdirde TRUE döndürür.
BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult)
{
__try
{
*pResult = dividend / divisor;
}
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
return FALSE;
}
return TRUE;
}
Örnek 2
Aşağıdaki örnek işlev DebugBreak işlevini çağırır ve kesme noktası özel durumunu denetlemek için yapılandırılmış özel durum işlemeyi kullanır. Böyle bir durum oluşursa, bu durum özel durumun hata ayıklayıcı tarafından işlenmediği ve işlevin YANLIŞ döndürdüğü anlamına gelir; aksi takdirde TRUE döndürür.
BOOL CheckForDebugger()
{
__try
{
DebugBreak();
}
__except(GetExceptionCode() == EXCEPTION_BREAKPOINT ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// No debugger is attached, so return FALSE
// and continue.
return FALSE;
}
return TRUE;
}
Örnek 3
Aşağıdaki örnekte iç içe işleyicilerin etkileşimi gösterilmektedir. RaiseException işlevi, bir özel durum işleyicisinin korunan gövdesi içinde yer alan bir sonlandırma işleyicisinin korunan gövdesinde bir özel duruma neden olur. Özel durum, sistemin FilterFunction işlevini değerlendirmesine neden olur ve dönüş değeri de özel durum işleyicisinin çağrılmaya neden olur. Ancak, özel durum işleyici bloğu yürütülmeden önce, sonlandırma işleyicisinin __finally bloğu yürütülür çünkü denetim akışı sonlandırma işleyicisinin __try bloğunu terk etti.
DWORD FilterFunction()
{
printf("1 "); // printed first
return EXCEPTION_EXECUTE_HANDLER;
}
VOID main(VOID)
{
__try
{
__try
{
RaiseException(
1, // exception code
0, // continuable exception
0, NULL); // no arguments
}
__finally
{
printf("2 "); // this is printed second
}
}
__except ( FilterFunction() )
{
printf("3\n"); // this is printed last
}
}