Г.3. Стандартные функции обработки ошибок

Г.3. Стандартные функции обработки ошибок

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

if (условие ошибки)

 err_sys(формат printf с любым количеством аргументов);

вместо

if (условие ошибки) {

 char buff[200];

 snprintf(buff, sizeof(buff), формат printf с любым количеством аргументов);

 perror(buff);

 exit(1);

}

Наши функции обработки ошибок используют следующую возможность ANSI С: список аргументов может иметь переменную длину. Более подробную информацию об этом вы найдете в разделе 7.3 книги [68].

В табл. Г.1 показано, в чем заключаются различия между функциями обработки ошибок. Если глобальная целочисленная переменная daemon_proc отлична от нуля, то сообщение об ошибке передается функции syslog с указанным уровнем, в противном случае оно отправляется в стандартный поток вывода сообщений об ошибках.

Таблица Г.1. Стандартные функции обработки ошибок

Функция strerror (errno ?) Завершение ? Уровень syslog
err_dump Да abort(); LOG_ERR
err_msg Нет return; LOG_INFO
err_quit Нет exit(1); LOG_ERR
err_ret Да return; LOG_INFO
err_sys Да exit(1); LOG_ERR

В листинге Г.3 показаны первые пять функций из табл. Г.1.

Листинг Г.3. Стандартные функции обработки ошибок

//lib/error.c

 1 #include "unp.h"

 2 #include <stdarg.h> /* заголовочный файл ANSI С */

 3 #include <syslog.h> /* для syslog() */

 4 int daemon_proc; /* устанавливается в ненулевое значение с

                       помощью daemon_init() */

 5 static void err_doit(int, int, const char*, va_list);

 6 /* Нефатальная ошибка, связанная с системным вызовом.

 7    Выводим сообщение и возвращаем управление */

 8 void

 9 err_ret(const char *fmt , ...)

10 {

11  va_list ap;

12  va_start(ap, fmt);

13  err_doit(1, LOG_INFO, fmt, ap);

14  va_end(ap);

15  return;

16 }

17 /* Фатальная ошибка, связанная с системным вызовом.

18    Выводим сообщение и завершаем работу */

19 void

20 err_sys(const char *fmt)

21 {

22  va_list ap;

23  va_start(ap, fmt);

24  err_doit(1, LOG_ERR, fmt, ap);

25  va_end(ap);

26  exit(1);

27 }

28 /* Фатальная ошибка, связанная с системным вызовом.

29    Выводим сообщение, сохраняем дамп памяти процесса и заканчиваем работу */

30 void

31 err_dump(const char *fmt, ... )

32 {

33  va_list ар;

34  va_start(ap, fmt);

35  err_doit(1, LOG_ERR, fmt, ap);

36  va_end(ap);

37  abort(); /* сохраняем дамп памяти и заканчиваем работу */

38  exit(1);

39 }

40 /* Нефатальная ошибка, не относящаяся к системному вызову.

41    Выводим сообщение и возвращаем управление */

42 void

43 err_msg(const char *fmt , ...)

44 {

45  va_list ap;

46  va_start(ap, fmt);

47  err_doit(0, LOG_INFO, fmt, ap);

48  va_end(ap);

49  return;

50 }

51 /* Фатальная ошибка, не относящаяся к системному вызову.

52    Выводим сообщение и заканчиваем работу. */

53 void

54 err_quit(const char *fmt, ...)

55 {

56  va_list ap;

57  va_start(ap, fmt);

58  err_doit(0, LOG_ERR, fmt, ap);

59  va_end(ap);

60  exit(1);

61 }

62 /* Выводим сообщение и возвращаем управление.

63    Вызывающий процесс задает "errnoflag" и "level" */

64 static void

65 err_doit(int errnoflag, int level, const char *fmt, va_list ap)

66 {

67  int errno_save, n;

68  char buf[MAXLINE + 1];

69  errno_save = errno; /* значение может понадобиться вызвавшему

                           процессу */

70 #ifdef HAVE_VSNPRINTF

71  vsnprintf(buf, MAXLINE, fmt, ap); /* защищенный вариант */

72 #else

73  vsprintf(buf, fmt, ap); /* незащищенный вариант */

74 #endif

75  n = strlen(buf);

76  if (errnoflag)

77   snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));

78  strcat(buf, " ");

79  if (daemon_proc) {

80   syslog(level, buf);

81  } else {

82   fflush(stdout); /* если stdout и stderr совпадают */

83   fputs(buf, stderr);

84   fflush(stderr);

85  }

86  return;

87 }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

2. Стандартные процедуры и функции

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

2. Стандартные процедуры и функции Арифметические функции1. Function Abs(X);Возвращает абсолютное значение параметра.X – выражение вещественного или целочисленного типа.2. Function ArcTan(X: Extended): Extended;Возвращает арктангенс аргумента.X – выражение вещественного или целочисленного


4. Стандартные процедуры и функции

Из книги Информатика и информационные технологии автора Цветкова А В

4. Стандартные процедуры и функции Арифметические функции1. Function Abs(X); возвращает абсолютное значение параметра.2. Function ArcTan(X: Extended): Extended; возвращает арктангенс аргумента.3. Function Exp(X: Real): Real; возвращает экспоненту.4. Function Frac(X: Real): Real; возвращает дробную часть аргумента.5. Function


1.6. Обработка ошибок: функции-обертки

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

1.6. Обработка ошибок: функции-обертки В любой реальной программе при любом вызове требуется проверка возвращаемого значения на наличие ошибки. Поскольку обычно работа программ при возникновении ошибок завершается, мы можем сократить объем текста, определив


В.З. Стандартные функции вывода сообщений об ошибках

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

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


69. Определите разумную стратегию обработки ошибок и строго ей следуйте

Из книги Справочник по PHP автора

69. Определите разумную стратегию обработки ошибок и строго ей следуйте РезюмеЕще на ранней стадии проектирования разработайте практичную, последовательную и разумную стратегию обработки ошибок и строго следуйте ей. Убедитесь, что ваша стратегия включает


Функции обработки ошибок

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Функции обработки ошибок error_logПосылка сообщения об ошибке.Синтаксис:int error_log(string message, int message_type [, string destination [, string extra_headers]])Сообщение, посылаемое этой функцией, может быть направлено в журнал системных сообщений web-сервера, прот TCP или в файл.В первом аргументе message


Директива обработки ошибок

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

Директива обработки ошибок В СП ТС реализована директива #error. Ее формат:#error <текст>Обычно эту директиву записывают среди директив условной компиляции для обнаружения некоторой недопустимой ситуации. По директиве #error препроцессор прерывает компиляцию и выдает


5.2. Стандартные служебные программы: Пуск | Все программы | Стандартные | Служебные

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

5.2. Стандартные служебные программы: Пуск | Все программы | Стандартные | Служебные В программной группе Стандартные | Служебные находятся следующие программы:? Internet Explorer (без надстроек) — запускает IE без надстроек, что поможет в случае, если какая-то из надстроек


16.3.10. Директивы обработки ошибок

Из книги Как раскрутить и разрекламировать Web-сайт в сети Интернет автора Загуменов Александр Петрович

16.3.10. Директивы обработки ошибок Такая директива всего одна, но она очень полезна. Например, произошла ошибка 404 (файл не найден). Вы можете сопоставить этой ошибке URL, на который будет перенаправлен браузер пользователя. Обычно перенаправление устанавливают на документ,


Улучшение посещаемости сайта за счет обработки ошибок

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

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


5.6. Стандартные потоки ввода, вывода и ошибок

Из книги Справка по SQL автора

5.6. Стандартные потоки ввода, вывода и ошибок С каждым процессом (командой, сценарием и т. п.), выполняемым в интерпретаторе shell, связан ряд открытых файлов, из которых процесс может читать свои данные, и в которые он может записывать их. Каждый из этих файлов


Функции Transact-SQL для обработки даты/времени

Из книги C++ для начинающих автора Липпман Стенли

Функции Transact-SQL для обработки даты/времени Стандарт SQL-92 специфицирует только функции, возвращающие системную дату/время. Например, функция CURRENT_TIMESTAMP возвращает сразу и дату, и время. Плюс имеются функции возвращающие что-либо одно.Естественно, в силу такой


1.4. Обработка ошибок: функции-обертки

Из книги Конец холивара. Pascal vs C автора Кривцов М. А.

1.4. Обработка ошибок: функции-обертки В любой реальной программе существенным моментом является проверка каждого вызова функции на предмет возвращаемой ошибки. В листинге 1.1 мы проводим поиск ошибок в вызовах функций socket, inet_pton, connect, read и fputs, и когда ошибка случается, мы


Стандартные математические функции

Из книги автора

Стандартные математические функции ABS (X) – абсолютная величина X.ARCTAN (X) – вычисление угла в радианах, тангенс которого равен X.COS (X) – вычисление косинуса угла в радианах.EXP (X) – Вычисление ex.LN (X) – вычисление натурального логарифма от X.PI – вычисление числа Пи.RANDOM –


Стандартные математические функции

Из книги автора

Стандартные математические функции Для того, чтобы использовать эти функции в начале программы должно стоять:#include <math. h>abs (x) – возвращает абсолютное значение целого аргумента x.acos (x) – арккосинус x.asin (x) – арксинус x.atan (x) – арктангенс x.cos (x) – косинус x.exp (x) – ex.fabs