Чи слід виводити ім’я програми, коли виникає попередження або помилка?


13

Якщо я пишу сценарій чи програму, чи повинен я вивести його ім'я разом із попередженням чи повідомленням про помилку? Наприклад:

./script.sh: Warning! Variable "var" lowered down to 10.

або:

./prog.py: Error! No such file: "file.cfg".

Я розумію, що загалом це лише питання смаку (особливо, якщо ви пишете власні речі для себе), але мені цікаво, чи є в цьому щось звичайне? Я вважаю, що більшість утилітів UNIX / Linux записують свої імена, коли щось відбувається, тому здається, що це добре, але чи є якісь вказівки чи невизначені правила, як це зробити, а як не робити?

Наприклад, не бажано встановлювати бінарні файли під /usr/bin/, а під /usr/local/bin/або щось інше. Чи існують подібні правила щодо виведення на stderr? Чи слід писати ім’я, за яким слід двокрапка? Або просто "Увага!" та "Помилка!" слова? Я нічого не міг знайти, але, можливо, хтось міг би вказати мені, де про це читати.

Це питання трохи стосується практики програмування, але я вважав, що це більше доречно тут, ніж про stackoverflow , оскільки це стосується традицій UNIX / Linux, а не програмування взагалі.


5
Назва програми може сприяти налагодженню випадкових випадків no such fileвід того, хто знає, яка програма в foo | bar | bazконвеєрі.
триг,

@thrig Спасибі, хороший момент. Міна не повинна бути трубопровідною, але хто знає. Здогадайтесь, що краще дотримуватися стандартної поведінки.
gsarret

Відповіді:


16

Загальна практика зберігає 0-й аргумент, переданий програмі C, mainі використовувати його як параметр для perror- для простих програм:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *foo = malloc(9999999999L);
    if (foo == 0)
        perror(argv[0]);
    return 0;
}

називаємо цю програму "foo", а запуск її ілюструє точку:

> ./foo
./foo: Cannot allocate memory

Складні програми можуть додавати до тексту (або використовувати лише ім'я файлу без шляху), але збереження назви програми дозволяє вам знайти, звідки походить програма, що не відповідає поведінці.

Не існує загальновизнаної схеми повідомлень про помилки, але деякі широко використовувані програми (наприклад, gcc) додають категорії повідомлень, такі як "Помилка" або "Попередження". Ось приклад з одного з моїх журналів збірки:

compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
        res = (TypeArgument *)argp;
              ^

У цьому прикладі gcc розділяє поля з двокрапками та додає категорію "попередження" після імені файлу, номера рядка, номера стовпця - і перед фактичним повідомленням. Але є декілька варіацій, які ускладнюють для програм (таких як vi-like-emacs ) для розбору інформації.

Для компіляторів використання категорії в повідомленні спрощує виявлення фатальних помилок (які можуть бути не негайно фатальними ) та попереджень. Якщо ваша програма закінчується помилкою, це не надто багато говорить про те, що деякі справді попереджають, а деякі - помилки. Але коли вона поводиться інакше (або продовжує працювати більш-менш), категорія допомагає діагностувати виниклу проблему.


Дякую за приклад, я розумію. Як щодо "Помилка" та "Попередження", вони захаращують вихід?
gsarret

Ваша остання редакція - саме те, про що я думав! Яка користь, якщо вона все-таки закриється після повідомлення про помилку? Знову дякую.
gsarret

8

Якщо програма викликається як частина сценарію, в якому викликається багато інших програм, і якщо вона не друкує свого імені, то користувачам буде важко (помилково) зрозуміти, звідки походить помилка.

(Якщо помилка - це якась несподівана внутрішня умова, яка може зажадати налагодження, ви хочете отримати ще більше інформації: не лише ім'я програми, а вихідний файл та номер рядка, можливо, і зворотній шлях.)


Спасибі. Я зазвичай пишу програми для себе (чисельне моделювання), тому є лише один користувач, однак я можу ними поділитися один день. Вони також не такі складні (ну, принаймні, поки що), тому немає проблем з пошуком джерела помилки, але, дякую за підказку, може бути корисним у майбутньому.
gsarret
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.