В отличие от веба, в низкоуровневых языках все немного сложнее. Язык Си (про плюсы я тут ничего не пишу, для C++ есть другие книги, справки и т.д.) доступны 2 вида исключений - собственно, расширения языка Си (CRT) и Windows SEH. Если уж разбираться до конца, то исключения Си базируются на SEH, но в тоже время, не работают без CRT (зачем это надо и как это обойти - напишу дальше).
Исключения языка Си
Ключевые слова: __try,__except,__finally,__leave
Если в вебе мы можем писать как угодно, то здесь нельзя миксовать операторы, на один блок __try должен быть один блок, или __except или __finally. Если нужно и то и то, то придется писать вложенные блоки. В блоке можно либо указать функцию-обработчик, либо указать, какой тип исключений будет обрабатываться:
__except (filter(GetExceptionCode(), GetExceptionInformation())) или __except (EXCEPTION_EXECUTE_HANDLER)
Пример с MSDNinclude 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;
};
}
В редких случаях, когда в обработчике действительно можно пофиксить проблему, можно вернуть EXCEPTION_CONTINUE_EXECUTION . Допустим , если память не выделена, выделить или там поделили на ноль, и можем заменить число..
Рихтер говорит, что VEH не может возвращать execute
@TRY_BEGIN MACRO Handler
pushad ;;Save Current State
mov esi, offset Handler ;;Address of New Exception Handler
push esi ;;Save Old Exception Handler
push dword ptr fs:[0] ;;Install New Handler
mov dword ptr fs:[0], esp
ENDM
@TRY_EXCEPT MACRO Handler
jmp NoException&Handler ;;No Exception Occured, so jump over
Handler:
mov esp, [esp + 8] ;;Exception Occured, Get old ESP
pop dword ptr fs:[0] ;;Restore Old Exception Handler
add esp, 4 ;;ESP value before SEH was set
popad ;;Restore Old State
ENDM
@TRY_END MACRO Handler
jmp ExceptionHandled&Handler ;;Exception was handled by @TRY_EXCEPT
NoException&Handler: ;;No Exception Occured
pop dword ptr fs:[0] ;;Restore Old Exception Handler
add esp, 32 + 4 ;;ESP value before SEH was set. 32 for pushad and ...
ExceptionHandled&Handler: ;;...4 for push offset Handler. (No Restore State)
;;Exception has been handled, or no exception occured
ENDM
https://www.codeproject.com/Articles/1212332/bit-Structured-Exception-Handling-SEH-in-ASMhttp://qxov.narod.ru/articles/seh/seh.htmlhttp://www.rohitab.com/structured-exception-handling-in-assembly-language