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: 69.276 ]

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


Tratamento de exceções em C



Apesar de ser um assunto que já foi muito explorado, grande parte das implementações sofrem certas limitações que impedem seu uso em certas situações. Para tornar o código portável, muitas dessas implementações fazem uso do preprocessador padrão do C, e facilidades disponíveis na biblioteca padrão.

Algumas limitações decorrem da tentativa de se fazer um tratamento de exceções que trabalha exatamente como o existente em uma linguagem de alto nível, esquecendo que a proposta da linguagem é de ser uma linguagem de médio, e não de alto nível. Aqui falo superficialmente sobre as limitações das diferentes abordagens.

Grande parte das limitações presentes nas implementações são o uso de variáveis globais para armazenar as variáveis necessárias para o tratamento de exceções. O uso de variáveis globais em ambientes computacionais que fazem uso de programação paralela, no entanto, é quase sempre inadequado.

Muitas implementações também impedem que se use saltos para dentro/fora de um bloco try. Ainda, outra limitação comum que ocorre é que os tipos que possam ser associados a uma exceção precisam ser declarados. Uma outra limitação comum é que apenas o tipo, e não o valor, pode ser capturado em uma exceção.

A implementação descrita nesse texto é thread-safe e permite que saltos para fora do bloco try sejam realizados (mas saltos para dentro continuam proibidos). Os tipos que possam ser disparados não precisam ser declarados e os valores também podem ser recuperados.

Porém ela impõe suas próprias limitações, descritas ao longo do texto. Uma limitação que vale ressaltar aqui, no entanto, é que na implementação descrita nesse texto, qualquer procedimento que possa disparar exceções precisa estar dentro de um bloco TRY, e funcionalidades disponíveis em C++ como unexpected_handler e terminate_handler não são implementadas por padrão.

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

GNU Emacs, o primeiro GNU

Aplicativos web em C++ usando o Tufão

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

VLC Media Player

Entendendo os codecs, os containers formats e por que o Ogg é tão bom

Leitura recomendada

Desenvolvendo para microcontroladores em GNU/Linux

A duplicação do buffer de saída na chamada de sistema fork() do Linux

Mapear objetos em C

Bug afeta todas as distros

Programação de Jogos com SDL

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts