Цитата: Алексей Гринь от сентября 23, 2009, 15:36А Вы не поняли?
Что такое?
Цитата: Вадимий от сентября 23, 2009, 05:06Что такое?
Ээээ...
Цитировать/* Проверяем, есть ли для треда текущее исключение. Если есть, значит мы ещё в CATCH-блоке, ошибка не поймана, а уже вызывается THROW. */
if(exst->data)
{
/* Релизим предыдущий объект исключения. */
RELEASE(exst->data);
/* Объявляем текущим исключением новое (которое кинуто в catch-блоке). */
exst->data = data;
/* Перескакиваем на высший контекст. Без этой строки зацикливалось бы на текущем контексте. */
dotorg_pop_env();
}
#include "System.h"
void innerfunc(void)
{
THROW(Exception_new_void());
}
int main(void)
{
TRY
{
printf("Before.\n");
innerfunc();
printf("After.\n");
}
CATCH(e)
{
if(TYPEOF(e) == typeof_Exception())
{
printf("Inside catch block!\n");
CATCHED;
}
}
END_TRY;
printf("After try block.\n");
return 0;
}
ЦитироватьBefore.
Inside catch block!
After try block.
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
Цитироватьif(!setjmp(dotorg_push_env())) /* TRY */
{
}
else /* CATCH */
{
}
dotorg_pop_env(); /* END_TRY */
<..> SetUnhandledExceptionFilter(&m_SEH_handler); <..>
static LONG WINAPI m_SEH_handler(LPEXCEPTION_POINTERS pp)
{
switch(pp->ExceptionRecord->ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
/* Тут можно выкидывать какой угодно собственный объект. */
THROW(System_AccessViolationException_new(S("No-o-o!")));
break;
/* ... etc. */
default:
return EXCEPTION_CONTINUE_SEARCH;
}
return EXCEPTION_CONTINUE_EXECUTION;
}
#include "System.h"
void innerfunc(void)
{
/* Намеренно вызываем SEGFAULT, чтобы получить SEH-исключение. */
int *a = 0;
a = *a;
}
int main(void)
{
TRY
{
printf("Before.\n");
innerfunc();
printf("After.\n");
}
CATCH(e)
{
printf("OMG! Access violation!\n");
CATCHED;
}
END_TRY;
return 0;
}
ЦитироватьBefore.
OMG! Access violation!
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.
Страница создана за 0.055 сек. Запросов: 22.