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

We use cookies. Read the Privacy and Cookie Policy

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

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

Таблица 26.2. Коды ошибок popt

Код ошибки Описание POPT_ERROR_NOARG Отсутствует аргумент для данного параметра. POPT_ERROR_BADOPT Невозможно проанализировать синтаксис аргумента параметра. POPT_ERROR_OPTSTOODEEP Слишком глубокое вложение замещений имени параметра. POPT_ERROR_BADQUOTE Несоответствие кавычек. POPT_ERROR_BADNUMBER Невозможно преобразовать параметр в число. POPT_ERROR_OVERFLOW Данное число слишком большое или слишком маленькое. POPT_ERROR_NOARG Параметр, для которого требуется аргумент, был определен в командной строке, однако аргумент не был предоставлен. Эта ошибка может быть возвращена только функцией poptGetNextOpt(). POPT_ERROR_BADOPT Параметр был определен в массиве argv, однако его нет в таблице параметров. Эта ошибка может быть возвращена только функцией poptGetNextOpt(). POPT_ERROR_OPTSTOODEEP Совокупность замещений имени параметра имеет большую глубину вложений. На данный момент popt отслеживает параметры только до 10 уровня, чтобы избежать возникновения бесконечной рекурсии. Эту ошибку возвращает только функция poptGetNextOpt(). POPT_ERROR_BADQUOTE В строке, прошедшей синтаксический анализ, было обнаружено несоответствие кавычек (например, была обнаружена только одна одинарная кавычка). Эту ошибку могут возвращать функции poptParseArgvString(), poptReadConfigFile() и poptReadDefaultConfig(). POPT_ERROR_BADNUMBER Преобразование строки в число (int или long) не было выполнено вследствие того, что строка содержит нецифровые символы. Эта ошибка возникает в том случае, когда функция poptGetNextOpt() обрабатывает аргумент типа РOРТ_ARG_INT или POPT_ARG_LONG. POPT_ERROR_OVERFLOW Преобразование из строки в число не было выполнено вследствие того, что число было слишком большим или слишком маленьким. Подобно ошибке POPT_ERROR_BADNUMBER, эта ошибка может возникнуть только в том случае, если функция poptGetNextOpt() обрабатывает аргумент типа РОРТ_ARG_INT или POPT_ARG_LONG. POPT_ERROR_ERRNO Системный вызов был возвращен вместе с ошибкой, а errno до сих пор содержит ошибку из системного вызова. Эту ошибку могут возвращать функции poptReadConfigFile() и poptReadDefaultConfig().

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

const char * poptStrerror(const int error);

Эта функция принимает код ошибки popt и возвращает строку с описанием ошибки, как и стандартная функция strerror().

char * poptBadOption(poptContext con, int flags);

Если во время выполнения функции poptGetNextOpt() возникла ошибка, эта функция возвращает параметр, вызвавший ошибку. Если аргументу flags присвоено значение POPT_BADOPTION_NOALIAS, возвращается самый внешний параметр. В противном случае аргумент flags должен иметь нулевое значение, а возвращаемый параметр может быть определен посредством псевдонима.

Для большинства приложений эти две функции существенно упрощают обработку ошибок popt. Если ошибка возникает во время выполнения большинства функций, то выводится сообщение об ошибке, а функция poptStrerror() возвращает строку с описанием ошибки. Если ошибка возникла во время синтаксического анализа аргумента, то код, подобный представленному ниже, отобразит информативное сообщение об ошибке.

fprintf(stderr, "%s: %s ",

 poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

 poptStrerror(rc));