Существуют ли руководства или руководящие принципы для разработки значений кода ошибки / выхода / возврата для инструментов командной строки? [Дубликат]

8
задан gioele 9 June 2014 в 14:28
поделиться

8 ответов

Нет такой вещи, как стандартный набор кодов выхода, которым должны соответствовать приложения.

Однако, как вы упомянули, есть некоторые общие, например, 0. В зависимости от операционной системы и используемых вами инструментов вы можете посмотреть коды выхода для похожих приложений и имитировать их.

2
ответ дан David 19 August 2018 в 01:34
поделиться
  • 1
    Ваша ссылка повреждена, и она не находится в кеше Google. (Кроме того, сообщение на форуме HP не похоже, что это, вероятно, будет особенно авторитетной ссылкой в ​​первую очередь.) – Mark Amery 9 May 2017 в 20:51

Возможно, вы можете принять некоторые из соглашений Unix.

В другом ответе пользователь David предложил

sysexits.h имеет список стандартных кодов выхода. Кажется, что это датируется по меньшей мере до 1993 года, и некоторые крупные проекты, такие как Postfix, используют его, поэтому я думаю, что это путь.

На странице руководства OpenBSD:

В соответствии со стилем (9) нецелесообразно вызывать exit (3) с произвольными значениями, чтобы указать условие отказа при завершении программы. Вместо этого следует использовать предопределенные коды выхода из sysexits, поэтому вызывающий процесс может получить приблизительную оценку класса отказа, не обращая внимания на исходный код.

Это список, который отображается в системе Debian:

#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

Внутри файла /usr/include/sysexits.h можно найти более подробные описания эти коды ошибок.

7
ответ дан Community 19 August 2018 в 01:34
поделиться

Я думаю, что единственным стандартом является 0 для успеха и ненулевой для отказа. И это скорее соглашение, чем стандарт.

14
ответ дан Douglas Leeder 19 August 2018 в 01:34
поделиться

Стандартный код состояния: EXIT_SUCCESS и EXIT_FAILURE, определенные в stdlib.h. Однако почти все используют 0 и 1 соответственно. Некоторое программное обеспечение будет использовать разные ненулевые коды для различных типов ошибок.

5
ответ дан Laurence Gonsalves 19 August 2018 в 01:34
поделиться

Единственное реальное соглашение состоит в том, что 0 означает успех и ненулевые значения (обычно 1) означает отказ. Для официальной ссылки на это см., Например, документы Microsoft C ++ в exit :

Как правило, вызывающий абонент устанавливает значение status в 0: укажите нормальный выход или какое-либо другое значение, чтобы указать ошибку.

Или документы C # на Envrionment.Exit и Environment.ExitCode , которые по-разному заявляют:

Используйте 0 (ноль), чтобы указать, что процесс завершен успешно.

и

Значение по умолчанию равно 0 (ноль), что указывает на успешное завершение процесса.

и

Используйте ненулевой номер для указания ошибки , В вашем приложении вы можете определить свои собственные коды ошибок в перечислении и вернуть соответствующий код ошибки на основе сценария. Например, верните значение 1, чтобы указать, что требуемый файл отсутствует, и значение 2, чтобы указать, что файл находится в неправильном формате. Список кодов выхода, используемых операционной системой Windows, см. В Системные коды ошибок в документации Windows.

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

  • Microsoft не рекомендуют использовать их в качестве кодов выхода приложений где угодно , и действительно явным образом предлагаю вам «определить свои собственные коды ошибок» в документации, которую я цитирую выше.
  • Microsoft не использует их последовательно в качестве кодов выхода в своих собственные приложения или команды. Хотя некоторые примеры приложений, которые делают , используют эти коды, такие как MsiExec.exe , есть еще много чего, например dir, dotnet или TAEF .
  • Использование их кажется мне явно плохой идеей. Есть тысяч из System Exit Codes , большинство из которых не имеют отношения к вашему конкретному приложению. Если вы попытаетесь их использовать, вы собираетесь тратить время на сбор списков, чтобы найти коды, применимые к вашему сценарию, и конечный результат будет менее полезен для разработчика, вызывающего ваше приложение, чем если бы вы только что определили небольшое число кодов выхода, которые имеют смысл для вашего конкретного приложения - сделайте это вместо этого.
0
ответ дан Mark Amery 19 August 2018 в 01:34
поделиться

Определенно существуют стандартные коды ошибок, определенные для Windows.

Давным-давно мы использовали отрицательные ошибки для конкретных «пользовательских» ошибок, но я сомневаюсь, что это хорошая практика.

Системные коды ошибок (Windows)

0
ответ дан Pyro 19 August 2018 в 01:34
поделиться
  • 1
    Вам не нужно использовать системные коды ошибок как коды выхода программы. Как уже отмечалось в других ответах, для программ Windows обычно используется 1 как код ошибки catch-all; если все использовали системные коды ошибок , это всегда означает «некорректная функция», (и вообще не было бы никакого указания на общую неопределенную ошибку). – Mark Amery 9 May 2017 в 20:47
  • 2
    Это правда, вам не нужно соблюдать стандарты. Вопрос касался стандартов, и именно это я и представил. Базовый случай равен нулю, указывает на успех, отличное от нуля указывает на отказ. Если вызывающий абонент не может справиться с конкретными сбоями, вам все равно, какая ошибка была в любом случае, но если вы ожидаете, что вызывающие абоненты будут действовать с ошибкой, это хорошая практика, чтобы дать значимые ошибки. Стандартные рекомендации дают структуру в таком случае. – Pyro 22 June 2017 в 15:57
  • 3
    "вам не нужно соблюдать стандарты & quot; - это не-sequitur; используя коды системных ошибок, поскольку коды выхода приложений ничего не делают для «соответствия стандартам». потому что нет никакого стандарта, нигде, который предлагает это сделать. ", если вы ожидаете, что вызывающие абоненты смогут выполнить сбой, хорошая практика дает значимые ошибки и - я согласен, но это плохо достигается с помощью системных кодов ошибок, так как их тысячи (так что вызывающий не могут их рассмотреть), и они, вероятно, будут слишком обобщенными, чтобы описать конкретную ошибку приложения значимым образом. – Mark Amery 16 December 2017 в 20:57

Внесите то, что вы будете использовать. Все остальное излишне.

-2
ответ дан Stephane Grenier 19 August 2018 в 01:34
поделиться

Коды выхода далеки от стандартных и больше используются разработчиком для получения соответствующей ошибки, возникшей после возврата приложения. Стандарт 0 для успеха, отличный от нуля для отказа, является общей тенденцией и используется, поскольку он позволяет использовать полный ненулевой диапазон для всех возможных ошибок.

Если ваше приложение регистрирует ошибки надлежащим образом, код выхода, вероятно, будет совершенно ненужным для отслеживания.

4
ответ дан Will Eddins 19 August 2018 в 01:34
поделиться