Pergunta

A seguir catch () não é chamado:

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

Existe uma maneira de capturar esse tipo de exceção?

Foi útil?

Solução

Por favor, cheque http://linux.die.net/man/1/gcc há uma opção do compilador -mcheck de zero-divisão para lidar com isso.

Como alternativa, a instalação de um manipulador SIGFPE pode ser uma opção, A div flutuante por 0, então, gerar um 'FPE_ZERODIVIDE'

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

desde

A maioria dos sistemas de ponto flutuante são baseados no padrão IEEE, que permite a divisão por 0. Esta retornos seja infinito positivo ou negativo infinito conforme apropriado com base nos sinais dos números. (Exceto 0/0 retorna a indefinido NaN -. Novamente, não um caso excepcional) Isto tende a ser útil para aplicações científicas e matemáticas. Os NANS sinalizar de forma eficaz num caso em que os cálculos não foram pssible mas permitir que os cálculos para continuar. Os cálculos contínuos não vai produzir novos resultados, mas vai continuar a regressar NANS. Isso permite longos longas cadeias de cálculos a serem realizados witout verificação de erros dentro do calculatiosn. As verificações de erro só precisa ser realizado no final do trabalho. Isso torna o código muito mais simples e também mais rápido. Ele também pode ser mais útil, às vezes, para algumas aplicações, infintity é um resultado "útil", não é realmente um sinal de problemas.

Outras dicas

Não - não há nenhuma exceção lançada (você receber um sinal - provavelmente SIGFPE). Você precisa verificar para possível dividir por zeros em seu código, e, em seguida, lançar uma exceção mesmo,

Se isto causa um erro de tempo de execução em todos (ver agradável discussão de lakshmanaraj em IEEE matemática , embora alguns compilador vai deixar você forçar erros em vez de Nans), ele lança uma exceção de ponto flutuante sinal .

Os sinais são um mecanismo diferente de exceções C ++, e são tratadas no nível OS. Há já uma série de perguntas para sobre o mecanismo de sinal * nix, incluindo:

Para Windows, você vai ter que pedir a alguém. Mac OS X é -. De course-- um unix sistema derivado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top