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

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

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

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

sockfd = Socket(AF_INET, SOCK_STREAM, 0);

Наша функция-обертка для функции socket показана в листинге 1.3.

Листинг 1.3. Наша функция-обертка для функции socket

//lib/wrapsock.c

172 int

173 Socket(int family, int type, int protocol)

174 {

175  int n;

176  if ((n = socket(family, type, protocol)) < 0)

177   err_sys("socket error");

178  return (n);

179 }

Хотя вы можете решить, что использование этих функций-оберток не обеспечивает большой экономии, на самом деле это не так. Обсуждая потоки (threads) в главе 26, мы обнаружим, что, когда происходит какая-либо ошибка, функции потоков не устанавливают значение стандартной переменной Unix errno равным определенной константе, специфической для произошедшей ошибки. Вместо этого значение переменной errno просто возвращается функцией. Это значит, что каждый раз, когда мы вызываем одну из функций pthread, мы должны разместить в памяти переменную, сохранить возвращаемое значение в этой переменной и установить errno равной этому значению перед вызовом err_sys. Чтобы избежать загромождения кода скобками, мы можем использовать оператор языка С запятая для объединения присваивания значения переменной errno и вызова err_sys в отдельное выражение следующим образом:

int n;

if ((n = pthread_mutex_lock(&ndone_mutex)) != 0)

 errno = n, err_sys("pthread_mutex_lock error");

ВНИМАНИЕ

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

При описании исходного кода, представленного в тексте книги, мы всегда ссылаемся на вызываемую функцию низшего уровня (например, socket), но не на функцию-обертку (например, Socket).

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

Pthread_mutex_lock(&ndone_mutex);

Листинг 1.4. Наша собственная функция-обертка для функции pthread_mutex_lock

//lib/wrappthread.c

72 void

73 Pthread_mutex_lock(pthread_mutex_t *mptr)

74 {

75  int n;

76  if ((n = pthread_mutex_lock(mptr)) == 0)

77   return;

78  errno = n;

79  err_sys("pthread_mutex_lock error");

80 }

ПРИМЕЧАНИЕ

Если аккуратно программировать на С, можно использовать макросы вместо функций, что обеспечивает небольшой выигрыш в производительности, однако функции- обертки редко, если вообще когда-нибудь бывают причиной недостаточной производительности программ.

Наш выбор — первая заглавная буква в названии функции — является компромиссом. Было предложено множество других стилей: подстановка префикса e перед названием функции (как сделано в [67, с. 182]), добавление _е к имени функции и т.д. Наш вариант кажется наименее отвлекающим внимание и одновременно дающим визуальное указание на то, что вызывается какая-то другая функция.

Эта технология имеет, кроме того, полезный побочный эффект: она позволяет проверять возникновение ошибок при выполнении таких функций, ошибки в которых часто остаются незамеченными, например close и listen.

На протяжении всей книги мы будем использовать эти функции-обертки, кроме тех случаев, когда нам нужно проверить ошибку явно и обрабатывать ее другим, отличным от прерывания программы, способом. Мы не приводим исходный код для всех наших собственных функций-оберток, но он свободно доступен в Интернете (см. предисловие).

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

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

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

3.1.4 Обработка ошибок

Из книги C++ автора Хилл Мюррей

3.1.4 Обработка ошибок Поскольку программа так проста, обработка ошибок не сотавляет большого труда. Функция обработки ошибок просто счтает ошибки, пишет сообщение об ошибке и возвращает управлние обратно:int no_of_errors;double error(char* s) (* cerr «„ "error: " «« s «« « “; no_of_errors++; return 1;


7.3.4 Обработка Ошибок

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

7.3.4 Обработка Ошибок Есть четыре подхода к проблеме, что же делать, когда во время выполнения универсальное средство вроде slist сталкивется с ошибкой (в С++ нет никаких специальных средств языка для обработки ошибок):1. Возвращать недопустимое значение и позволить


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

Из книги Системное программирование в среде Windows автора Харт Джонсон М

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


Пример: обработка ошибок

Из книги Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов автора Айзенберг Джеффри

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


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

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

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


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

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

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


Обработка ошибок и исключения

Из книги XSLT автора Хольцнер Стивен

Обработка ошибок и исключения Обработка ошибок — сложная задача, при решении которой программисту требуется вся помощь, которая только может быть предоставлена. — Бьярн Страуструп (Bjarne Stroustrup), [Stroustrup94] §16.2 Имеется три способа написать программу без ошибок; но работает


Отслеживание и обработка ошибок

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

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


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

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

26.4. Обработка ошибок Каждая из функций popt, которая может возвращать ошибки, возвращает целочисленные значения. В случае возникновения ошибки возвращается отрицательный код. В табл. 26.2 перечислены коды возможных ошибок. После таблицы дается подробное обсуждение каждой


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

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

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


ГЛАВА 32. Обработка ошибок и события.

Из книги HTML5 для веб-дизайнеров автора Джереми Кит

ГЛАВА 32. Обработка ошибок и события. В этой главе мы рассмотрим, как при выполнении модулей PSQL - триггеров и процедур - можно перехватывать и обрабатывать ошибки в выполняемом коде.Стандартным поведением модулей PSQL при появлении исключений является остановка выполнения,


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

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

Обработка ошибок Спецификация HTML5 не просто объявляет, что должны делать браузеры, когда они обрабатывают синтаксически правильную разметку. Впервые за всю историю HTML спецификация также объявляет, что? браузеры должны делать, когда им встречаются документы с ошибками


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

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

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