2010-08-11 6 views
3

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

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

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

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

ответ

5

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

1

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

В любом случае, here - интересная дискуссия об этом.

1

Существует несколько способов сделать это.

1) Enums - Это можно сделать следующим образом. Существует гибкость для добавления разных кодов ошибок, когда вам нужно, и поместить их в группу. Say ошибки, связанные с аутентификацией пользователя, доступ к файлам, ошибки 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) Отрицательные значения, возвращаемые как межд но это будет много боли, поскольку эта ссылка должна быть хорошо документирована для значений.

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

3

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

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

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

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

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

+0

Если фраза «это то, что вызывающий может сделать по этому поводу», читается как «то, что может сделать CALLER»? Если да, отредактируйте. – user1284631

+0

Коды выхода - это одно, коды ошибок (errno global) - это что-то еще. Они шире, для одного (минимум 32 бита). arch/mips/include/asm/errno.h #defines EMAXERRNO, чтобы вы могли начать работу над этим. (К сожалению, нет другого ядра errno.h, которое #defines that) – Urhixidur

1

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

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

Смежные вопросы