Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Ошибку можно считать ситуацией, которая иногда может возникнуть в известном месте. Ошибки при системных вызовах, например, должны немедленно обнаруживаться логикой кода, и о них должно выдаваться сообщение. Для этого программисты обычно вставляют явную проверку, чтобы узнать, не потерпела ли неудачу, например, операция чтения из файла.
С другой стороны, исключение может возникнуть почти в любом месте, и проверку на исключение сделать невозможно или неудобно. Примеры — деление на нуль и нарушения доступа к памяти.
Тем не менее различие между ошибками и исключениями иногда стирается. Win32 может генерировать исключения в ходе резервирования памяти функциями НеарАllос и HeapCreate, если объема памяти недостаточно. Программы также могут вызывать собственные исключения с определенными программистом кодами с помощью функции RaiseException.
Обработчики исключений позволяют выходить из внутренних блоков или функций по логике программы, не прибегая для передачи управления к goto или longjmp. Эта возможность особенно ценна, если блок кода обращается к таким ресурсам, как открытые файлы, память или объекты синхронизации, так как обработчик может освободить их; кроме того, можно продолжить выполнение программы после обработчика исключения, не завершая ее. Также программа может восстанавливать при выходе из блока состояние системы.
Генерируемые пользователем исключения
С помощью функции RaiseException можно вызвать исключение в любой точке в ходе выполнения программы. Таким образом программа сможет обнаружить ошибку и обработать ее как исключение.
VOID RaiseException (DWORD dwExceptionCode,
DWORD dwExceptionFlags, DWORD cArguments, LPDWORD lArguments)
Параметры
dwExceptionCode — код, определяемый пользователем. Не используйте бит 28, который зарезервирован для системы. Код ошибки устанавливается в битах 27-0 (т.е. во всех, кроме самой старшей шестнадцатеричной цифры). Бит 29 устанавливается для обозначения "заказного" исключения (не Microsoft). Биты 31—30 указывают строгость исключения. Ниже показано, как это делается, причем начальная шестнадцатеричная цифра кода показана для случая, когда бит 29 установлен.
• 0 — успех (начальная цифра 2).
• 1 — информационный (начальная цифра 6).
• 2 — предупреждение (начальная цифра А).
• 3 — ошибка (начальная цифра Е).
Параметр dwExceptionFIags обычно устанавливается в 0, но установка значения в EXCEPTION_NONCONTINUABLE указывает, что выражение фильтра не должно генерировать EXCEPTION_CONTINUE_EXECUTION; если это будет так, произойдет немедленное исключение EXCEPTION_NONCONTINUABLE.
Параметр lpArguments, если не имеет значения NULL, указывает на массив размера cArguments (третий параметр), содержащий 32-разрядные значения, которые будут переданы в выражение фильтра. Максимально допустимое количество параметров EXCEPTION_MAXIMUM_PARAMETERS в настоящее время равно 15. Обращаться к этой структуре следует через GetExceptionInformation.
Дата публикования: 2015-11-01; Прочитано: 364 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!