Devo enviar o nome do programa quando ocorrer um aviso ou erro?

13

Se eu estou escrevendo um script ou um programa, devo enviar para stderr seu nome junto com uma mensagem de aviso ou erro? Por exemplo:

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

ou:

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

Eu entendo que geralmente é apenas uma questão de gosto (especialmente se você escreve suas próprias coisas por si mesmo), mas eu me pergunto se há algo convencional nisso? Eu acredito que a maioria dos utilitários UNIX / Linux escreve seus nomes quando algo acontece, então parece ser uma coisa boa, mas há alguma diretriz ou regras tácitas de como fazer isso e como não?

Por exemplo, não é aconselhável instalar binários em /usr/bin/ , e sim em /usr/local/bin/ ou outra coisa. Existem regras semelhantes sobre a saída para o stderr? Devo escrever o nome seguido de dois pontos? Ou apenas "Atenção!" e "Erro!" palavras? Eu não consegui encontrar nada, mas talvez alguém pudesse me indicar onde ler sobre isso.

Esta questão é um pouco sobre práticas de programação, mas achei que é mais apropriado aqui do que em stackoverflow , já que é sobre UNIX / Linux tradições e não programar em geral.

    
por gsarret 01.09.2016 / 23:55

2 respostas

16

É uma prática comum salvar o argumento 0th passado para um programa em C main e usá-lo como parâmetro para perror - para programas simples:

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

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

chame esse programa de "foo" e executá-lo ilustra o ponto:

> ./foo
./foo: Cannot allocate memory

Programas complicados podem adicionar ao texto (ou usar apenas o nome do arquivo sem o caminho), mas manter o nome do programa permite que você descubra de onde vem um programa com comportamento inadequado.

Não há um esquema universalmente aceito para mensagens de erro, mas alguns programas amplamente usados (como o gcc) adicionam uma categoria de mensagem como "Erro" ou "Aviso". Aqui está um exemplo de um dos meus logs de compilação:

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;
              ^

Neste exemplo, o gcc separa campos com dois-pontos e adiciona uma categoria "aviso" após o nome do arquivo, número da linha, número da coluna - e antes da mensagem real. Mas há várias variações, o que é complicado para programas (como vi-like-emacs ) para analisar a informação.

Para compiladores, usar uma categoria na mensagem simplifica a detecção de erros fatais (que podem não ser imediatamente fatais ) e avisos. Se o seu programa sair por um erro, isso não adiciona muito para dizer que alguns são realmente avisos e alguns são erros. Mas quando se comporta de maneira diferente (ou continua a trabalhar mais ou menos), a categoria ajuda a diagnosticar o problema encontrado.

    
por 02.09.2016 / 00:14
8

Se um programa é chamado como parte de um script no qual muitos outros programas são invocados, e se ele não imprimir seu nome, os usuários acharão difícil (duro) descobrir de onde o erro está vindo.

(Se o erro for alguma condição interna inesperada que pode exigir depuração, você quer ainda mais informações: não apenas o nome do programa, mas um arquivo de origem, um número de linha e possivelmente um backtrace.)

    
por 01.09.2016 / 23:58