Как нумеровать мои Custom errnos - PullRequest
       12

Как нумеровать мои Custom errnos

3 голосов
/ 11 августа 2010

Я возвращаю код ошибки, если моя программа была прервана ненормально (через exit ()). Для стандартных ситуаций я просто возвращаю базовое значение errno (например, ENOMEM для сбойных malloc и т. Д.). Однако есть также случаи, когда мне придется прекратить работу из-за моих собственных причин, по которым не определены системные ошибки.

Какие значения ошибок я должен вернуть, чтобы они не конфликтовали с существующими. Или я все делаю задом наперед?

edit: Извините, если мне не ясен вопрос. Я не говорю о enum и т. Д. (Это механизм определения кодов ошибок). Я говорил о диапазоне значений, которые они могли бы принять, не сталкиваясь со стандартными.

Чего я не знал, так это того, что программа может возвращать только 8-битные состояния. Таким образом, кажется, что @r является правильным - это слишком мало, чтобы вместить, может быть, даже все стандартные, не говоря уже о моих пользовательских ошибках. так что 1/0 это:)

Ответы [ 5 ]

5 голосов
/ 11 августа 2010

Ширина кода возврата обычно довольно мала, например ограничена 8 битами, поэтому в ней сложно хранить много информации.На самом деле я не стал бы беспокоиться о кодах выхода, кроме 0/1 (успех / сбой), если ваша программа не предназначена для использования в сценариях оболочки, и в этом случае вам, вероятно, просто нужно выяснить, в каких случаях может потребоваться проверка потенциального сценария оболочкии различать их (например, «нет совпадения» и «ресурс исчерпан при поиске»).

3 голосов
/ 11 августа 2010

Какие значения ошибок я должен вернуть, чтобы они не конфликтовали с существующими.Или я все делаю задом наперед?

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

Мое личное правило для кодов возврата - убедиться, что они полезны для обработки ошибок.Например, для пакетной программы я мог бы посмотреть коды состояния, например:

  • 0 - ОК,
  • 1 - внутренняя, но, вероятно, исправимая ошибка (например, ошибка выделения памяти, уничтожениедругие пакеты и попробуйте перезапустить),
  • 2 - фатальная ошибка в конфигурации (перезапуск не поможет),
  • 3 - фатальная ошибка во входных данных (заменить ввод, попробуйте снова),
  • 4 - на выходе получена ошибка переполнения диска (clean / tmp, попробуйте еще раз).

Это всего лишь пример, чтобы подчеркнуть, что коды ошибок должны рассматриваться из POV вызывающей стороны,не вызываемыйЕсли, например, полная / частичная автоматизация не является целью, и пользователи все равно должны анализировать файлы журналов, то также будет достаточно возврата 0 или 1.

1 голос
/ 11 августа 2010

В системе, совместимой с Posix, нет абсолютно никакого смысла возвращать любое число вне диапазона от 0 до 255. Это потому, что системный вызов wait () позволяет получить только восемь младших битов возвращаемого значения вашей программы (или, возможно, 16 бит).

На практике вам, скорее всего, понадобится всего несколько кодов, может быть, просто 0 и 1. Дополнительная информация может быть передана через stderr в более полезном (для человека) текстовом формате.

1 голос
/ 11 августа 2010

Есть несколько способов сделать это.

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

enum
{
ERROR_GROUP_1 =100,// This gives 99 error codes for a particular group, can be initialised to negative value too.
GROUP1_1,
.
.
ERROR_GROUP_2 = 200
GROUP2_2,
.
.
and so on
};

2) Использовать директивы препроцессора

#define ERROR_CODE_START 00000000L

#define ERROR_CODE_1 (ERROR_CODE_START + 1)

3) Отрицательные возвращаемые значения в виде int, но это будет очень мучительно, поскольку ссылка должна быть хорошо документирована для значений.

4) Вы можете создать такую ​​структуру, как GError . Передайте ссылку на эту структуру в каждом API и заполните ее. Если значение не равно NULL, вызывающая сторона может проверить код ошибки и строку, которые будут установлены в API.

1 голос
/ 11 августа 2010

Рассматривали ли вы использование enum для определения кодов ошибок?

В любом случае, здесь - интересное обсуждение этого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...