Jump to content

Deus Ex Machina


fredericopissarra

Recommended Posts

Ninguém vai descer dos céus para salvar o seu código se você mesmo não verificar os possíveis erros... Quase todas as funções da biblioteca padrão de C te informam condições de erro. Por exemplo, scanf().

scanf() serve para "varrer" (scan) um stream, obedecendo um "formato" (o "f" no final do nome da função) realizando conversões de itens selecionados para variáveis apontadas na lista de argumentos... A função sempre retorna a quantidade de conversões que conseguiu fazer ou -1, em caso de erros "catastróficos", digamos assim (ela retornará 0 se não conseguiu converter nada)... Outra função muito usada é printf(), que sempre retorna a quantidade de caracteres "impressos" (aliás: printf vem de "print formated", porque usa a string de formatação antes dos argumentos contendo os valores), ou -1 em caso de erro "catastrófico"... A exceção é snprintf(), que sempre retorna a quantidade de caracteres que "poderiam" ser impressos. Por exemplo:

char s[5];
int len;

// O tamanho, no segundo argumento, INCLUI o '\0' final.
// O retorno EXCLUI o '\0'... Aqui, len será 9.
len = snprintf( s, sizeof s, "Frederico" );

printf( "%s (would print %d chars).\n", s, len );

Exceto pelo caso do scanf(), geralmente não prestamos muita atenção ao printf() e assumimos que ele sempre imprimirá o que mandamos. É uma suposição bastante segura, mas assumir isso com coisas como arquivos e sockets não é.

Discos podem falhar, cabos de rede podem ser partidos, ruidos podem aparecer na linha e conexões podem cair... Assim, a verificação das confições de erro das funções que lidem com arquivos e sockets é impressindível. Além das funções retornarem valores especiais para indicarem erros, é prudente verificar o conteúdo da "variável" global errno (e incluir o header file errno.h). Por exemplo, a função send() pode retornar -1 em caso de erro e errno ser ajustado para ECONNRESET (Connection reset by peer) ou outro erro qualquer... Da mesma forma, connect() pode retorna -1 e errno ser setado para ECONNREFUSED ou ENETUNREACH... Outras funções como socket(), bind(), accept(), recv(), ... também têm suas condições de erro e devem ser respeitadas.

No caso de arquivos a mesma coisa ocorre.... open(), read() e write() também retornam -1 e setam errno de acordo...

Uma observação sobre o uso de errno: Em caso de sucesso as funções da libc não a resetam (ajustando-a para zero). É seu trabalho fazer isso, por exemplo:

errno = 0;
if ( send( fd, buffer, bufsize, 0 ) == -1 )
{
  // trata erro aqui.
}

// se não houve erro, errno será zero aqui!

Outro detalhe de errno: Ele é "thread safe"... Cada thread tem o seu próprio errno, independente.

[]s
Fred

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...