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