Пример функции ReportError для вывода сообщений об ошибках при выполнении системных вызовов
/* Универсальная функция для вывода сообщений о системных ошибках. */
#include "EvryThng.h"
VOID ReportError (LPCTSTR UserMessage, DWORD ExitCode, BOOL PrintErrorMsg){
DWORD eMsgLen, LastErr = GetLastError();
LPTSTR lpvSysMsg;
HANDLE hStdErr - GetStdHandle (STD_ERROR_HANDLE);
PrintMsg (hStdErr, UserMessage);
if (PrintErrorMsg){
eMsgLen=FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, LastErr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpvSysMsg, 0, NULL);
PrintStrings (hStdErr, _T (“\n”), lpvSysMsg, _T (n\n")/ NULL);
/* Освободить блок памяти, содержащий сообщение об ошибке. */
HeapFree (GetProcessHeap (), 0, lpvSysMsg);
}
if (ExitCode > 0) ExitProcess (ExitCode);
else return;
}
Если отслеживать исключения, которые возникают на том или ином участке программы, надо создать блоки try и except:
__try{ /* Блок контролируемого кода */ }
__except(выражение_фильтра){/*Блок обработки исключений*/}
__try и __except - ключевые слова, опознаваемые компилятором.
Блоки try являются частью обычного кода приложения. Если на данном участке кода возникает исключение, ОС передает управление обработчику исключений, который представляет собой блок программного кода, следующий за ключевым словом except. Характер последующих действий определяется значением параметра выражение_фильтра. Исключение может возникнуть также в пределах блока, находящегося внутри try-блока; в этом случае средства поддержки времени исполнения "разворачивают" стек, чтобы отыскать в нем информацию об обработчике исключений, после чего передают управление этому обработчику. То же самое происходит и в тех случаях, когда исключения возникают внутри функций, вызванных в пределах try-блока.