Скачиваний:
77
Добавлен:
12.05.2015
Размер:
177.66 Кб
Скачать

1.9. Обработка ошибок

Очень часто при возникновении ошибки в любой из функций системы UNІX эта функция возвращает отрицательное число, а в глобальную переменную errno записывается некоторое целое число, которое несет дополнительную информацию о возникшей ошибке. Например, функция open возвращает либо файловый дескриптор – неотрицательное число, либо –1 – в случае возникновения ошибки. Вообще через переменную errno функция open может возвращать 15 различных кодов ошибок, таких как отсутствие файла, недостаточность прав доступа и тому подобное. Некоторые функции следуют иному соглашению. Например, большинство функций, которые должны возвращать указатель на какой-либо объект, в случае ошибки возвращают пустой указатель.

Определения переменной errno и констант всех возможных кодов ошибок находятся в заголовочном файле <errno.h>. Имена констант начинаются с символа E. Кроме того, в ОС Linux коды ошибок и соответствующие им имена констант перечислены на странице errno(3) справочного руководства.

Для вывода сообщений об ошибках стандарт языка C предусматривает две функции.

#include <string.h>

char *strerror (int errnum);

/* функция возвращает указатель на строку сообщения об ошибке */

Эта функция преобразует код ошибки errnum, обычно равный значению errno, в строку сообщения об ошибке и возвращает указатель на нее.

Функция perror, основываясь на значении errno, выводит сообщение об ошибке на стандартный вывод сообщений об ошибках и возвращает управление.

#include <stdio.h>

void perror (const char *msg);

Она выводит строку сообщения msg, двоеточие, пробел и текст сообщения об ошибке, соответствующий значению errno. Вывод заканчивается символом перевода строки.

Ошибки, определенные в файле <errno.h>, могут быть разделены на две категории – фатальные и нефатальные. Восстановление нормальной работы после фатальных ошибок невозможно. Самое лучшее, что можно сделать в данной ситуации, – это вывести сообщение об ошибке на экран или записать его в файл журнала и завершить работу приложения. Нефатальные ошибки допускают нормальное продолжение работы. Большинство нефатальных ошибок по своей природе носят временный характер (например, нехватка ресурсов), и их можно избежать при меньшей загруженности системы.

К нефатальным ошибкам, связанным с нехваткой ресурсов, относятся EAGAIN, ENFILE, ENOBUFS, ENOLCK, ENOSPC, ENOSR, EWOULDBLOCK и иногда ENOMEM. Если ошибка EBUSY указывает на то, что разделяемый ресурс в настоящий момент времени занят, она также может рассматриваться как нефатальная.

Для восстановления после вышеперечисленных ошибок, как правило, достаточно приостановить работу на короткое время и повторить попытку. Эта методика может применяться и в других ситуациях. Например, если ошибка свидетельствует о разрыве сетевого соединения, можно подождать некоторое время и затем попытаться восстановить соединение. В некоторых приложениях используется алгоритм экспоненциального увеличения времени задержки, когда пауза между попытками увеличивается при каждой итерации.

В конечном счете, сам разработчик приложения решает, после каких ошибок возможно продолжение работы. Применяя разумную стратегию восстановления после ошибок, мы можем существенно повысить отказоустойчивость приложения и избежать аварийного завершения его работы.

Соседние файлы в папке Chapter.1
  • #
    12.05.2015100.86 Кб541_1.vsd
  • #
    12.05.201598.3 Кб461_2.vsd
  • #
    12.05.201589.6 Кб461_3.vsd
  • #
    12.05.201592.16 Кб471_4.vsd
  • #
    12.05.201591.14 Кб471_5.vsd
  • #
    12.05.2015177.66 Кб77Часть1.doc