Съвместяване на двата механизма Win32 SEH и C++ Exception Handling
| Информационни технологии | 2009-12-04 | 108 сваляния |
22 Съвместяване на двата механизма (Win32 SEH и C++ Exception Handling).
Някои проблеми в SEH механизма:
-
Възможно е ако работим само със SEH механизма да пропуснем деструкцията на някои проблеми.
-
SEH механизма дава възможност за много точно детайлиране на причината на ниско ниво, но при положение че сме прихванали съответната причина при SEH.
-
Повечето стандартни С++ функции са написани така, че хвърлят С++ exception, а не SEH exception.
Възможно е рпеобразуването на обекти на SEH към С++ exception обекти. За целта в 32 битовите SEH механизми е преджидена _set_se_translator позволява дефинирането на потребителска функция и извършва транслация на SEH механизма към С++ exception механизма. В My_func се изпълнява транслацията и се хвърля (throw) С++ exception обект, който съдържа информация с exception.
western" style= "font-style: italic; margin-bottom: 0in; text-indent: 0.5in"> unsigned int m_nCode;
public: CWin32Except( unsigned int nCode ) : m_nCode(nCode){};
unsigned int Code() const {return m_nCode;};
}
използване:
void SEH_MyFunc( unsigned int nCode, EXCEPTION_POINTERS* pExp ){
throw CWin32Except( nCode );
}
void DoAccessViolation(){
int* p =0;
*p = 32;
}
void main(void){
_se_translator_function fn old;
fnold = _set_se_translator( SEH_MyFunc );
try{
DoAccessViolation();
}
catch( CWin32Except& e ){
cout << изкл. с CWin32Except << endl; cout << Exception is << e.Code() << endl;
}
_set_se_translator( fnold);
}
23 Обработка на изключителни ситуации при подкрепата на MFC класивете. Последователност на обработките.
MFC дефинира над 10 класа свързани с exceptions.
try
{
// Execute some code that might throw an exception.
}
catch( CException* e ){
// Handle the exception;"e" contains information
e->Delete();
}
// Other normal program statements ...
try{
//Execute code that might throw an exception.
}
catch( CMemoryException* e ){
// Handle the out-of-memory exception here.
}
catch( CFileException* e ){
// Handle the file exceptions here.
}
catch( CException* e ){
// Handle all other types of exceptions here.
}
-
Генерира се exception. -
Намира се съответнияат catch блок. -
Предава се обекта exception catch блока. -
Автомат. деструкция на всички обекти създадени в try блока от началото до момента на ген. наexception в обратен ред.
Тагове от реферата: мехниз, Win32, Съвместяване, HANDLING, exception











