comment obtenir le numéro de ligne d'erreur dans le programme C ++
Je veux gérer les erreurs dans mon programme en c++, j'ai donc créé certaines classes d'exception pour gérer ces erreurs, mais je tiens à préciser à la ligne dans mon programme de l'erreur s'est produite.
J'ai passé LIGNE macro pour le constructeur de ma classe d'exception.
Par exemple:
void f(int i){ //LINE A
if(i<0)
throw(OutOfRange("message", __LINE__); //LINE B
}
void main(){
try{
f(-6); //LINE C
}
catch(const OutOfRange& error){
//do something
}
}
Dans cet exemple, je ne peux que vous obtenez la LIGNE B numéro, mais je veux obtenir la LIGNE A et la LIGNE C des nombres.
Une idée, où et comment les utiliser LIGNE macro ??
Grâce.
source d'informationauteur CHAKRI
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche d'une trace de la pile et il n'y a pas de portable manière de les obtenir. Quelque chose d'un peu similaire peut être réalisé avec:
Puis à droite après le début de chaque fonction (ou un point d'intérêt que vous venez d'ajouter une ligne... par exemple
L'utilisation de cette approche dans vos gestionnaires d'erreur, vous pouvez savoir qui a été appelé par l'oms et ainsi de suite (bien sûr, vous savez seulement des fonctions ou des endroits qui ont été instrumentés avec MARK_FUNCTION). Si cela n'est nécessaire que lors des tests (et non en production), alors vous devriez probablement juste de permettre core dumps et d'apprendre à gérer un débogueur en analyse post-mortem.
Vous avez besoin d'une trace de la pile et un débogueur. Il n'y a pas façon Standard C++ que vous pourriez trouver la ligne C sans passer ça comme un argument (
f(-6, __LINE__)
), et aucun moyen que vous pourriez trouver la Ligne A.Ligne C serait presque impossible (je ne peux pas penser à un moyen... sauf en passant un deuxième argument à
f
__LINE__
.Une ligne comme suit:
La CPPUNit cadre utilise des macros au lieu des fonctions. De cette façon, vous pouvez facilement obtenir le numéro de la ligne à l'endroit même où la macro est appelée.
Je ne pense pas que c'est une approche valable dans un sens général, mais vous trouverez peut-être intéressant de jeter un oeil à la façon dont le CPPUnit développeurs n'ont.