Какие «стандартные» коды возврата / завершения приложения должно поддерживать приложение? - PullRequest
9 голосов
/ 08 октября 2009

Существует ли такая вещь, как стандартный набор кодов возврата приложения? Такие вещи, как возвращение 0 для успеха 1 для неудачи, и так далее?

У меня есть приложение для Windows Server, в которое я добавляю несколько кодов ошибок возврата, и я хотел придерживаться стандартных кодов в дополнение к специальным кодам, которые мне понадобятся.

Ответы [ 8 ]

14 голосов
/ 08 октября 2009

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

7 голосов
/ 09 июня 2014

Может быть, вы сможете принять некоторые соглашения 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 можно найти более подробное описание этих кодов ошибок.

6 голосов
/ 08 октября 2009

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

4 голосов
/ 08 октября 2009

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

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

3 голосов
/ 08 октября 2009

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

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

1 голос
/ 16 декабря 2017

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

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

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

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

и

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

и

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

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

  • Microsoft не советует использовать их в качестве кодов выхода приложения в любом месте , и действительно явно предлагает вам "определить свои собственные коды ошибок" в документации I цитата выше.
  • Microsoft не использует их последовательно в качестве кодов выхода в своих собственных приложениях или командах. Хотя есть несколько примеров приложений, которые делают , использующих эти коды, например MsiExec.exe , есть еще много таких, которые не используются, например dir, dotnet или Таеф .
  • Использование их мне кажется явно плохой идеей. Существует тысяч из кодов выхода системы , большинство из которых не имеют отношения к конкретному приложению. Если вы попытаетесь использовать их, вы потратите впустую время, просматривая список, чтобы найти коды, применимые к вашему сценарию, и конечный результат будет менее полезен для разработчика, вызывающего ваше приложение, чем если бы вы только что определили небольшое число кодов выхода, которые имеют значение для вашего конкретного приложения - так что сделайте это вместо этого.
0 голосов
/ 26 ноября 2016

Определенно для Windows определены стандартные коды ошибок.

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

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

0 голосов
/ 08 октября 2009

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

...