Tratamento de exceções na linguagem C

Uma implementação de tratamento de exceções usando a linguagem C, discutindo vários modelos e suas limitações, possíveis vazamentos de memórias, testes comparativos, muitos exemplos, introdução a certos recursos da linguagem, ... É certamente um assunto interessante se você quer expandir seus conhecimentos da linguagem C.

[ Hits: 63.609 ]

Por: Vinícius dos Santos Oliveira em 11/11/2010 | Blog: https://vinipsmaker.github.io/


Exceções associadas a inteiros



Agora nós temos um comportamento cujo funcionamento básico é muito similar ao try - catch presente na linguagem C++. O que precisa-se agora são informações sobre a exceção disparada, para que consiga-se fazer o tratamento adequado.

#define NOT_A_NUMBER 1

int divide(int a, int b) throw(int)
{
  if (b) {
    return a / b;
  } else {
    throw(NOT_A_NUMBER);
  }
}

É fácil observar que se substituirmos a estrutura de seleção if pela estrutura switch, podemos ter um controle mais amplo associando o valor de retorno da função setjmp com o tipo da exceção disparada.

int main()
{
  int a, b;
  printf("Informe o divisor e o dividendo\n");
  scanf("%d%d", &a, &b);
  jmp_buf try;
  //try
  switch (setjmp(try)) {
  case 0:
    printf("%i\n", divide(a, b, try));
    break;
  // catch(NOT_A_NUMBER)
  case NOT_A_NUMBER:
    printf("Informe um número diferente de 0 para o denominador\n");
    break;
  // catch(...)
  default:
    printf("Erro inesperado\n");
    exit(EXIT_FAILURE);
  }
}

Há, entretanto, algumas limitações com esse modelo. Primeiro, temos de ter muito cuidado ao definir as constantes que serão associadas aos tipos de exceções para evitar colisões. Segundo, não podemos agregar muitas informações sobre possíveis erros que ocorram com a exceção disparada através do uso desse modelo.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Tratamento de exceções em C
   3. Quebra de fluxo de execução, goto e setjmp
   4. Exceções associadas a inteiros
   5. Informação sobre os tipos em tempo de execução
   6. Macros
   7. Aninhando exceções
   8. Mais macros
   9. Memory leaks
   10. Uso em dispositivos móveis
   11. Conclusão
Outros artigos deste autor

Mupen64plus, o melhor emulador de Nintendo 64 disponível para GNU/Linux

VLC Media Player

A história do hardware

História da informática: Um pouco de datas e especificações

Próximas Tecnologias do Sistema GNU/Linux

Leitura recomendada

Parâmetros interessantes do scanf e do printf em C

Bug afeta todas as distros

Linguagem C - Funções Variádicas

Programação de Jogos com SDL

Projeto Icecream (parte 1)

  
Comentários
[1] Comentário enviado por removido em 11/11/2010 - 17:16h

Gostei da aparência do código usando macros para definir os blocos try, catch e throw.

E parabéns pela contribuição de suas idéias!

[2] Comentário enviado por mslomp em 11/11/2010 - 18:17h

permita-me contribuir com conteúdo referente a esse assunto, a quem interessar:
há um tempo atrás postei na seção Scripts um código referente a isso:
http://www.vivaolinux.com.br/script/Excecoes-em-C-atraves-de-trythrowcatch

baseado na questão de um usuário em:
http://www.vivaolinux.com.br/topico/C-C++/C-e-Java

parabéns, um ótimo artigo conceitual e referencial

[3] Comentário enviado por SamL em 12/11/2010 - 12:06h

Cara gostei do artigo, nota 10.
Usar essas macros deixa um código bem mais limpo e organizado.

[4] Comentário enviado por gedarius em 12/11/2010 - 12:06h

ótimo artigo, parabéns!!!!

[5] Comentário enviado por vinipsmaker em 12/11/2010 - 15:47h

@mslomp, vlw, é bom saber que esse assunto interessa a muitos.

E aos outros, agradeço os elogios (críticas também são bem-vindas, caso tenham alguma =D ).

[6] Comentário enviado por mazinsw em 12/11/2010 - 19:41h

valeu pela contribuição, eu não sabia usar macros agora está mais fácil.

[7] Comentário enviado por vinipsmaker em 02/03/2013 - 19:19h

Migrei o código para https://github.com/vinipsmaker/c-except


Contribuir com comentário