ten swój super testowy program
żartowałem , rozwiązanie nie jest moje ani bardzo super ... tylko takie typowe.
Wielkie dzięki
Obawiam się ze nie ma za co :-D .
Jak napisałem , wszystko jest pięknie ale w MinGw __try i __except nie działa prawidłowo
Widocznie pomimo obecności pewnych wpisów w plikach nagłówkowych MinGW,
kompilator nie wspiera obsługi wyjątków w stylu __try __except w Windows .
[ program sie kompiluje ale źle działa i nie łapie wyjątku ]
w MVC++ 2005 Express natomiast ten kod działa:
#include <windows.h>
#include <iostream>
using namespace std ;
// rekurencyjna funkcja przepełniająca stos .
// Na podstawie "Programowanie Aplikacji dla Microsoft Windows"
unsigned int Suma(unsigned int ile)
{
return ((ile==0)? 0 : (ile+Suma(ile-1)));
}
//--------------------------------------------------
long __stdcall FiltrWyjatku(DWORD ExcptCode)
{
if(ExcptCode == STATUS_STACK_OVERFLOW)
{ return EXCEPTION_EXECUTE_HANDLER;} // wykonaj naszą obsługę
else{
return EXCEPTION_CONTINUE_SEARCH; // szukaj innego handlera
}
}
//--------------------------------------------------
// fnkcja z łapaniem Overflow
// Jeśli zostanie przechwycony wyjątek funkcja zwraca 0
// jeśli nie ,sumę liczb od wartości zadanej do 0
unsigned int __stdcall SumaKontrolowana(unsigned int ile)
{
unsigned int suma = ile;
unsigned int suma_ret = 0 ;
__try{
suma_ret = Suma(suma);
}
__except(FiltrWyjatku(GetExceptionCode()))
{
cout << "Zlapano Overflow" << endl ;
cin.get();
}
return suma_ret ;
}
//--------------------------------------------------------
int main(int argc,char**param)
{
int return_code ;
if( 0 == (return_code = SumaKontrolowana(6000000)))
{
cout << "Funkcja Przepelnila STOS ." << endl;
}else{
cout << "Funkcja nie przepelnila STOSU. " << endl ;
cout << "Wartosc powrotu = " << return_code << endl;
}
cout << "Po wykonaniu SumaKontrolowana();" << endl ;
cout << "Dalszy Kod - tu jestesmy bezpieczni, do czasu :-). " << endl ;
cin.get();
return 0 ;
}
Przy zastosowaniu instalacji Handlera ( ten co działa ) w MinGW -> __try1(ExceptionFun) ;
nie bardzo widzę możliwość dalszego wykonania programu po mimo przechwycenia
wyjątku , ale może ktoś rzuci jakieś rozwiązanie , chwilowo nie mam czasu , ... ,
Acha można sprawdzić jeszcze inne rozwiązania z Handlerami SEH Windows oprócz zwykłego
__try except .....
ps. Przy zastosowaniu -_try funkcja może pozostawic jakąś wartość w zmiennej globalnej przed
rzuceniem wyjątku .
Jeśli stosujemy Handler można spróbować tak samo , jednak dalsze wykonanie kodu
będzie wymagać 'naprawienia wadliwego ' w czasie wykonania po wybraniu EXCEPTION_CONTINUE_EXECUTION
lub nadpisania kodu poprzez Handler i przekierowanie do innej funkcji lub jej całkowitego ominięcia .
Czyli trzeba rozwinąć kod :
#include <excpt.h>
#include <iostream.h>
EXCEPTION_DISPOSITION ExceptionFun (EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,CONTEXT *ContextRecord,void * dispatcherContext)
{
cout << "Wyjatek Overflow" << endl ;
return ExceptionContinueExecution;
}
//-------------------------------------------------------------------
unsigned int Suma(unsigned int ile)
{
return ((ile==0)? 0 : (ile+Suma(ile-1)));
}
//--------------------------
int main(int count,char**param)
{
__try1(ExceptionFun);
Suma(600000);
// to sie jednak nie wykona
cout << "Po wyjatku..." << endl ; // brak rozwiązania
// brak kolejnego Handlera
cin.get();
return 0 ;
}
i dopisać treść Handlera ...
EXCEPTION_CONTINUE_EXECUTION wraca wykonanie programu do instrukcji która spowodowała
wyjątek , nie sądzę jednak aby to było pierwsze wywołanie fun. Suma , czyli znajdziemy
sie w samym środku bałaganu , jak to odkręcić bez wywalenia programu to nie mam pojęcia ...
Albo dołączyć coś takiego [masakra] :
http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh
nie sprawdzałem działania ...