2010-07-16 5 views
0

J'ai couru dans le compilateur cassé, ce qui ne permet pas aux exceptions d'hériter de std::exception (nvcc 3.0).Exceptions personnalisées C++

Nous avons donc dû créer solution de contournement:

struct exception { 
    explicit exception(const char* message) { 
     what_ = message; 
    } 
    virtual const char *what() const throw() { return what_; } 
    operator std::exception() const { 
     return std::runtime_error(what_); 
    } 
private: 
    const char* what_; 
}; 

struct configuration_error : exception { 
    configuration_error(const char* message) 
     : exception(message) {} 
}; 

est là quelque chose que je vais perdre en ne héritant d'exception, au lieu fournissant casting? est ce qui est nécessaire dans le cas ci-dessus?

merci

+0

Pourquoi ne vous laisse-t-il pas en hériter? (Erreurs?) Peut-être que nous pouvons pirater autour de lui et permettre l'héritage, ou est-ce strictement une chose "simplement impossible"? – GManNickG

+0

De quelle manière ne permet-il pas de dériver de 'std :: exception'? BTW, il est probablement préférable d'hériter de l'un des types '' ('std :: exception' n'a même pas de constructeur utile). - Votre solution de contournement semble également souffrir d'une manière très discutable de stocker la chaîne - êtes-vous sûr que le pointeur pourrait ne pas devenir invalide dans le cas d'une chaîne locale? – UncleBens

+0

@GMan Je reçois une erreur «appel externe à exception». Ce qui n'a aucun sens car c'est une erreur spécifique à la fonction du périphérique. Cela n'affecte que lorsque vous essayez d'initialiser un objet complexe dans le constructeur. Je suis assez sûr que c'est un bug du compilateur, le compilateur précédent (nvcc 2.x) n'avait aucun problème – Anycorn

Répondre

2

catch (std::exception) n'attraperez pas votre exception, et vous ne pouvez pas dynamic_cast votre exception à std::exception soit. Si votre programme ne fait jamais l'une ou l'autre de ces choses, tout va bien.

Personnellement, je n'utiliserais pas un compilateur aussi cassé.

+0

Eh bien, c'est seulement un en ce moment pour la programmation cuda – Anycorn

0

Vous devriez passer à CUDA 3.1.

0

Si vous essayez de créer une instance de quelque chose dérivé de std :: exception sur le périphérique, cela ne fonctionnera pas car le constructeur std :: exception devra être appelé, et ce n'est pas une fonction de périphérique . Lancer et attraper votre propre type est probablement la solution. Comme il ne retournera probablement jamais au code hôte, (C++ ne gère pas vraiment le lancement de plusieurs exceptions en parallèle), la compatibilité avec std :: exception ne devrait pas poser trop de problèmes.