Jump to content
Sign in to follow this  
fredericopissarra

Deus Ex Machina

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

  • l33t 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...