Donc, j'essaie d'écrire une classe d'Exception de base simple pour C++, basée sur la classe Java Exception. Je suis sûr qu'il existe déjà de bonnes bibliothèques, mais je le fais pour la pratique, pas pour le code de production, et je suis curieux et je cherche toujours à apprendre. L'une des choses que fait l'Exception de Java, que je voudrais aussi implémenter, est le concept de «cause». En Java, une nouvelle exception à une cause ressemble à:Implémentation de la classe Exception en C++
Exception cause = new Exception();
Exception newExcept = new Exception(cause);
Cependant, en C++, en passant une exception comme argument du constructeur est de savoir comment le constructeur de copie est appelée. Donc, il y a la déconnexion conceptuelle entre copier l'Exception et créer une nouvelle Exception avec une cause. Ce n'est pas un problème en Java, évidemment. Je suppose que je me demande juste quelle serait la meilleure façon de gérer cela. Quelques idées que j'avais été:
- Différencier avec une variable fictive
- il suffit de créer une nouvelle exception, et appelé méthode setCause()
- Quelque chose comme constructeur de copie est
Exception(Exception &)
et constructeur avec la cause estException(Exception *)
Merci
Les exceptions levées IIRC ne sont pas allouées sur la pile, mais dans une zone de mémoire «spéciale» utilisée uniquement pour contenir des exceptions levées, car lorsqu'une exception se propage, la pile est déroulée. –
@matteo Vous avez probablement raison. Ils sont "spéciaux" car le déroulement de la pile a déjà eu lieu lorsque le bloc catch est appelé. Probablement c'est spécifique au compilateur. –
Vous devez utiliser un pointeur intelligent pour gérer m_BaseException car les objets d'exception sont copiés partout. Actuellement, vous allez potentiellement supprimer votre pointeur d'exception de base (et récursivement sa chaîne) plusieurs fois. –