2.12.1. Для каждой функции ЯГС существует фиксированный набор ошибочных ситуаций, каждая из которых будет приводить к вызову функции ОБРАБОТАТЬ ОШИБКУ. Такой механизм контроля ошибок должен присутствовать во всех реализациях ЯГС. Функции ОБРАБОТАТЬ ОШИБКУ обеспечивают интерфейс между ЯГС и прикладной программой. Если функция ОБРАБОТАТЬ ОШИБКУ представлена прикладной программой, то она может интерпретировать информацию об ошибке и может запоминать данные в области данных для последующей интерпретации прикладной программы после выхода из функции ЯГС, во время выполнения которой произошла ошибка.
2.12.2. Стратегия обработки ошибок в ЯГС основана на следующей классификации ошибок:
класс 1 - ошибки, вызывающие точно определенную реакцию;
класс 2 - ошибки, приводящие к попытке сохранить результаты предыдущих операций;
класс 3 - ошибки, которые вызывают непредсказуемые результаты, включая потерю информации.
ЯГС различает три ситуации, в которых обнаруживаются ошибки:
ситуация А - ошибка обнаружена в функциях ЯГС;
ситуация Б - ошибка обнаружена в функциях, к которым было обращение ЯГС (функции драйверов и операционных систем);
ситуация В - ошибка обнаружена в других частях прикладной программы.
2.12.3. Если ошибки обнаружены вне ЯГС (ситуация В), то прикладная программа либо снова получает управление для продолжения выполнения программы, либо происходит аварийное завершение программы. В последнем случае результаты работы программы непредсказуемы (класс 3), и в худшем случае вся графическая информация, подготовленная в задаче до этого момента, может быть потеряна. Если же прикладная программа получает управление, она может сделать попытку явно закрыть ЯГС надлежащим образом или, по крайней мере, попытаться аварийно закрыть ЯГС путем обращения к функции АВАРИЙНО ЗАКРЫТЬ ЯГС. Аналогично, если ошибка возникла в функциях, вызываемых из ЯГС, и управление не возвращено в ЯГС надлежащим образом, то результаты также являются непредсказуемыми.
2.12.4. Функция АВАРИЙНО ЗАКРЫТЬ ЯГС является средством, зависящим от реализации. Ее назначением является сохранение как можно большей части подготовленной графической информации. Ее можно непосредственно вызвать из прикладной программы. Она также вызывается из самого ЯГС в виде стандартной реакции на ошибки класса 2.
2.12.5. Ошибки, которые явно перечислены в составе описания ЯГС, относятся к классу 1 ошибок. Эти ошибки либо обнаруживаются внутри самого ЯГС, либо функция, вызванная из ЯГС, передает управление в соответствующую функцию ЯГС вместе с соответствующей информацией об ошибке. Во всех случаях ошибок класса 1 ЯГС обращается к функции ОБРАБОТАТЬ ОШИБКУ. Если при вызове функции ЯГС возникает сразу несколько ошибочных ситуаций, то сообщается по крайней мере об одной из этих ошибок.
2.12.6. В прикладной программе может иметься собственная программа обработки ошибок или использоваться функция обработки ошибок, предусмотренная в составе ЯГС. Любая функция обработки ошибок получает от ЯГС следующую информацию:
1) идентификацию ошибки;
2) идентификацию функции ЯГС, которая вызвала функцию ОБРАБОТАТЬ ОШИБКУ;
3) файл ошибок.
2.12.7. Функция ОБРАБОТАТЬ ОШИБКУ, входящая в состав ЯГС, фактически только обращается к функции ЗАРЕГИСТРИРОВАТЬ ошибку с тем же самым набором параметров. Последняя функция выполняет следующие действия:
1) записывает сообщение об ошибке и идентификатор функции ЯГС в файл ошибок;
2) возвращает управление вызывающей программе.
Вызов функций обработки ошибок в два этапа позволяет реализовать в прикладной программе свою собственную функцию ОБРАБОТАТЬ ОШИБКУ и в то же время сохранить доступ к сервисным возможностям, предоставляемым функцией ЗАРЕГИСТРИРОВАТЬ ОШИБКУ, как это можно видеть из следующего примера прикладной программы, содержащей функцию ОБРАБОТАТЬ ОШИБКУ:
ОБРАБОТАТЬ ОШИБКУ (номер ошибки, идентификатор функции ЯГС, файл ошибок);
произвести идентификацию функции ЯГС и ошибки для того, чтобы различить следующие варианты:
вариант "специальная обработка":
интерпретировать параметры ошибки, переданные из ЯГС;
сохранить информацию для прикладной программы в указанной ею области данных;
возвратить управление в вызывавшую функцию ЯГС;
вариант "стандартная обработка":
вызвать функцию ЗАРЕГИСТРИРОВАТЬ ОШИБКУ со всеми выше перечисленными параметрами;