Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


ѕараметры. dwExceptionCode Ч код исключени€, определ€емый пользователем




dwExceptionCode Ч код исключени€, определ€емый пользователем. Ѕит 28 использовать нельз€, так как он зарезервирован системой. ƒл€ кода ошибки отвод€тс€ биты 27Ч0 (то есть все слово, кроме самого старшего шестнадцатеричного разр€да). Ѕит 29 должен быть установлен, чтобы показать, что данное исключение имеет "пользовательскую" природу (а не относитс€ к числу тех, которые предусмотрела Microsoft). ¬ битах 31Ч30 содержитс€ код серьезности ошибки, принимающий приведенные ниже значени€, в которых результирующа€ старша€ шестнадцатерична€ цифра кода исключени€ представлена с установленным битом 29.

Х 0 Ч успешное выполнение (старша€ шестнадцатерична€ цифра кода исключени€ равна 2).

Х 1 Ч информационный код (старша€ шестнадцатерична€ цифра кода исключени€ равна 6).

Х 2 Ч предупреждение (старша€ шестнадцатерична€ цифра кода исключени€ равна ј).

Х 3 Ч ошибка (старша€ шестнадцатерична€ цифра кода исключени€ равна ≈).

dwExceptionFlags Ч обычно устанавливаетс€ равным 0, тогда как установка значени€ EXCEPTION_NONCONTINUABLE будет указывать на то, что выражение фильтра не должно возвращать значение EXCEPTION_CONTINUE_EXECUTION; при попытке это сделать будет немедленно сгенерировано исключение ≈’—≈–TION_NONCONTINUABLE_EXCEPTION.

lpArguments Ч этот указатель, если он не равен NULL, указывает на массив размера cArguments (третий параметр), содержащий 32-битовые значени€, которые должны быть переданы выражению фильтра. ћаксимально возможное число этих значений ограничиваетс€ значением EXCEPTION_MAXIMUM_PARAMETERS, которое в насто€щее врем€ установлено равным 15. ƒл€ доступа к этой структуре следует использовать функцию GetExceptionInformation.

«аметьте, что невозможно сгенерировать исключение в другом процессе. ¬ то же врем€, при весьма ограниченных услови€х дл€ этой цели могут быть использованы обработчики управл€ющих сигналов консоли, о чем говоритс€ в конце этой главы и в главе 6.

ѕример: обработка ошибок как исключений

¬ предыдущих примерах дл€ обработки ошибок при выполнении системных вызовов и других ошибок используетс€ функци€ ReportError. Ёта функци€ прекращает выполнение процесса, если программист указал, что данна€ ошибка €вл€етс€ критической. ¬месте с тем, такой подход преп€тствует нормальному выходу из программы и не обеспечивает возможность продолжени€ работы программы после устранени€ последствий ошибки. “ак, после отказа от задачи, котора€ привела к возникновению сбо€, может потребоватьс€ уничтожение временных файлов, созданных в процессе работы программы, или переход программы к выполнению других задач. ‘ункции ReportError присущи и другие ограничени€, перечень которых приводитс€ ниже.

Х ƒаже в тех случа€х, когда было бы достаточно прекратить выполнени€ только одного потока, критическа€ ошибка приводит к остановке всего процесса (главу 7).

Х ¬место завершени€ процесса может оказатьс€ желательным продолжение выполнени€ программы.

Х ¬о многих случа€х становитс€ невозможным освобождение ресурсов синхронизации (глава 8), например мьютексов.

ѕри прекращении выполнени€ процесса (но не потоки) открытые дескрипторы будут закрыватьс€, однако при этом необходимо учитывать другие отрицательные факторы.

–ешение заключаетс€ в написании новой функции Ч ReportException. ≈сли ошибка не €вл€етс€ критической, эта функци€ вызывает функцию ReportError (разработанную в главе 2), котора€ выводит сообщение об ошибке. ¬ случае же возникновени€ критической ошибки будет сгенерировано исключение. —истема будет использовать обработчик исключений из вызывающего try-блока, и поэтому в действительности характер исключени€ может быть некритическим, если обработчик предоставл€ет программе возможность восстановитьс€ после сбо€. ѕо существу, функци€ ReportException дополн€ет обычные программные методы защиты от ошибок, ранее ограниченные функцией ReportError. ¬ случае обнаружени€ ошибки обработчик позвол€ет программе продолжить свою работу после выполнени€ необходимых восстановительных действий. Ёти возможности иллюстрирует программа 4.2.

‘ункци€ ReportException представлена в программе 4.1. Ќеобходимые определени€ и заголовочные файлы не указаны, поскольку эта функци€ находитс€ в том же модуле исходного кода, что и функци€ ReportError.

ѕрограмма 4.1. ReportException: функци€ вывода сообщений об исключени€х

/* –асширение функции ReportError дл€ генерации формируемого приложением кода исключени€ вместо прекращени€ выполнени€ процесса. */

VOID ReportException(LPCTSTR UserMessage, DWORD ExceptionCode)

/* ¬ывести сообщение о некритической ошибке. */

{

ReportError(UserMessage, 0, TRUE);

/* ≈сли ошибка критическа€, сгенерировать исключение. */

if (ExceptionCode!= 0) RaiseException((0x0FFFFFFF & ExceptionCode) | 0xE0000000, 0, 0, NULL);

return;

}

‘ункци€ ReportException используетс€ в нескольких последующих примерах.

ћодель сигналов, используема€ в UNIX, значительно отличаетс€ от SEH. —игналы могут быть пропущены или игнорированы, и логика их работы ина€. “ем не менее, у этих моделей имеютс€ и общие черты.

«начительна€ часть поддержки обработки сигналов в UNIX обеспечиваетс€ библиотекой —, ограниченна€ верси€ которой доступна также под управлением Windows. ¬о многих случа€х в программах Windows вместо сигналов можно воспользоватьс€ обработчиками управл€ющих сигналов консоли, описанными в конце данной главы.

Ќекоторые сигналы соответствуют исключени€мWindows.

ѕеречень в некоторой мере ограниченных соответствий "сигнал-исключение" представлен ниже:

Х SIGILL Ч EXCEPTION_PRIV_INSTRUCTION

Х SIGSEGV Ч EXCEPTION_ACCESS_VIOLATION

Х SIGFPE Ч семь различных исключений, св€занных с выполнением операций над числами с плавающей точкой, например EXCEPTION_FLT_DIVIDE_BY_ZERO

Х SIGUSR1 и SIGUSR2 Ч исключени€, определ€емые приложением

‘ункции RaiseException соответствует функци€ библиотеки — raise.

¬ Windows сигналы SIGILL, SIGSEGV и SIGFPE не генерируютс€, хот€ функци€ raise может генерировать один из них. —игнал SIGINT в Windows не поддерживаетс€.

‘ункци€ UNIX kill (kill не входит в состав стандартной библиотеки —), котора€ посылает сигнал другому процессу, может быть сопоставлена функции Windows GenerateConsoleCtrlEvent (глава 6). ƒл€ ограниченного варианта SIGKILL в Windows имеютс€ аналоги в виде функций TerminateProcess и TerminateThread, с помощью которых один процесс (или поток) может уничтожить другой, хот€ при использовании этих функций необходимо соблюдать осторожность (см. главы 6 и 7).





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-09-20; ћы поможем в написании ваших работ!; просмотров: 506 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

Ќадо любить жизнь больше, чем смысл жизни. © ‘едор ƒостоевский
==> читать все изречени€...

1228 - | 988 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.011 с.