2 votes

Exception C++Handeler : terminate est toujours appelé

Je viens de commencer à utiliser les exceptions en C++, mais à chaque fois qu'une exception est appelée, mon programme se termine par :

se termine après le lancement d'une instance de "MonException1".

what() : Votre publicité pourrait se trouver ici

et je ne sais pas pourquoi. Je dois utiliser C++03, car je programme pour un système QNX.

Ma classe d'exception :

using namespace std;
#include <exception>

class Exception : public exception
{
public:
    Exception(const char* msg): msg_((char*)msg) {};

    virtual const char* what() const throw()
    {
        return msg_;
    }

    virtual ~Exception() throw(){};

private:
    char* msg_;
};

class MyException1 : public Exception
{
public:
    MyException1(const char* message):Exception(message){}
};

La classe qui lance et attrape l'exception :

using namespace std;
#include "ExceptionUseExample.h"
#include <iostream>

void ExceptionUseExample::doSomethingElse() throw()
{
    throw MyException1("Hier koennte Ihre Werbung stehen");
}

void ExceptionUseExample::doSomething()
{
    try
    {
        doSomethingElse();
    }
    catch (MyException1& e)
    {
        cerr << "catched MyException1: " << e.what() << endl;
    }

}

0voto

max66 Points 4276

Le problème (si je ne me trompe pas) se situe au niveau de doSomethingElse() ; vous le déclarez comme throw() Vous déclarez donc qu'il ne lève pas d'exceptions. Lancer une exception, c'est tuer le programme.

Vous devez supprimer throw() ou ajouter le type de l'exception levée ; quelque chose comme

void doSomethingElse() throw(MyException1)

ou

void doSomethingElse() throw(Exception)

En passant, je vous signale un autre point dangereux (même si je ne me trompe pas).

Le constructeur de votre Exception reçoit un pointeur sur char et le copier dans un membre de la classe. Mais qui s'assure qu'il pointe vers une zone de mémoire valide (allouée) lorsque ( what() ) vous l'utilisez ? Je suppose que vous devriez faire une copie de la zone pointée.

p.s. : désolé pour mon mauvais anglais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X