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.405 ]

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


Mais macros



Podemos facilmente implementar outras macros interessantes para adicionar funcionalidades que nos permitiriam tratar todas as exceções, disparar uma exceção que não pode ser tratada normalmente, impedir que uma exceção associe um valor a exceção, entre outros. As macros citadas estão implementadas abaixo:

#define CATCHANY } else {
#define THROWNOTHING(x) longjmp(_eb ## x, 1);
#define TRY_VOID_ARGS(x) _eb ## x, NULL

A macro CATCHANY deve ser sempre usada após o último bloco CATCH, ou logo após o bloco TRY, caso não haja nenhum bloco CATCH. Usar a macro THROWNOTHING evitará que ela aloque memória para um valor, mas também fará com que a exceção só possa ser tratada por um bloco CATCHANY, o que não é muito útil, pois caso hajam dois locais dentro de um bloco TRY onde essa macro é usada (duas possíveis exceções que serão disparadas e não se identificarão), fica impossível saber em qual desses locais a exceção ocorreu.

Caso, dentro de um bloco TRY, todas as possíveis exceções que possam ser disparadas recebam o mesmo tratamento e o valor disparado não é utilizado, pode ser útil utilizar a macro TRY_VOID_ARGS, para impedir alocamento desnecessário de memória.

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

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

VLC Media Player

Aplicativos web em C++ usando o Tufão

Próximas Tecnologias do Sistema GNU/Linux

A história do ogg na web

Leitura recomendada

Ponteiros - Saindo de Pesadelos

lib cURL - Trabalhe com URLs em C

A poderosa nuvem: Intel® DevCloud com GPU Iris Xe Max!

openCertiface: Biométrica Facial em nuvem baseada em software livre

A mágica do polimorfismo e seus conceitos na ótica de C/C++

  
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