Quoi de mieux pour l'utiliser, un __try/__à l'exception de bloquer ou d'un bloc try / catch?
Je me demande qui est la meilleure façon d'attraper les exceptions que je lance: c'est un __try /__à l'exception de bloquer ou d'un bloc try /catch?
J'écris en C++ et le programme sera uniquement utilisé sur Windows, de sorte que la portabilité n'est pas un problème.
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un
try
/catch
bloc.Comme d'autres l'ont déjà répondu,
__try
/__except
est pour la capture de la SEH (windows généré des erreurs) pas pour attraper les exceptions générales.Le plus important,
__try
et__catch
peut ne pas fonctionner C++ destructeurs ou se détendre correctement la pile lorsqu'une exception est levée.Sauf dans de rares cas, vous ne devriez jamais essayer d'attraper SEH exceptions.
EDIT: Bien, j'ai été positif sur cette (c'est ce que j'ai toujours dit), mais @Hans dit qu'apparemment il y a un commutateur de compilateur que vous pouvez utiliser pour changer cela. Je pense que les docs sur
/EHa
sont trompeuses, ou à tout le moins incomplète, sur ce qui se passe ici. Si quelqu'un trouve définitive docs qui prouvent que c'est mal, je vais joyeusement supprimer cette réponse.Même s'il s'avère que c'est faux, vous devriez toujours utiliser
try
etcatch
tout simplement parce qu'ils sont standard, tandis que__try
et__except
ne le sont pas.__try
/__except
comme autre chose qu'un rapport d'incident système, alors qu'il est fréquent d'être en mesure de récupérer à partir d'une exception dans untry
/catch
bloc.__try
et__except
sont strictement un C API/ABI./EHa
est simplement qu'elle permet la gestion des exceptions C++ constructions (lorsque vous utiliseztry
etcatch
) pour attraper SEH des exceptions, mais que la pile C++ n'est toujours pas correctement déroulé lors de la__try
et__except
sont utilisés./EHa
. (Veuillez s'il vous plaît ne pas utiliser/EHa
)Ils sont deux très choses différentes. try/catch sont familiers C++ mots-clés que vous connaissez.
__try/__except
est utilisé pour attraper SEH exceptions. Les Exceptions soulevées par Windows lui-même, comme DivisionByZero ou AccessViolation. Il est bien décrit dans le Article de MSDN Library pour elle.Vous pouvez également l'utiliser pour attraper les exceptions C++, car il tire parti de la Windows SEH fonctionnalité. Cependant, vous ne pouvez pas obtenir la levée d'une exception d'objet en dehors de ça, donc, il y aura zéro contexte si vous voulez vraiment la traiter l'exception. Ce qui est une folie. Le numéro un de la démarche est de ne jamais attraper SEH exceptions près, ils sont toujours en brut. Si vous avez besoin de marier les deux, puis utiliser _set_se_translator() pour convertir le SEH exception à l'une des exceptions C++.
__try/__except
est conçu pour appeler Win32 code C qui ne supporte pas des exceptions, mais n'utilisez structuré un code d'erreur /d'un mécanisme de gestion.__try/__except
traduira C erreurs dans un bloc d'exception similaire C++ try/catch.Pour plus d'informations, voir cet article MSDN.
Standard C++ utilise des blocs try/catch, donc je vous conseille de les utiliser, si vous avez besoin de la "norme" mécanisme d'exception, basé sur la bibliothèque C++ standard.
Toutefois, si vous prévoyez d'utiliser la gestion Structurée des exceptions prévues par SDK de Windows (voir ici), puis utilisez
__try
/__except
.std::exception
n'est pas un STL classe.Une fois que vous avez jeté quelque chose, vous n'avez plus beaucoup de choix sur la façon de l'attraper. Si vous jetez des exceptions C++ (c'est à dire, avec
throw
), puis utiliseztry
/catch
. Si vous jetez Windows exceptions (c'est à dire, avecRaiseException
), puis utilisez__try
/__except
. Essayer de mélanger sera juste ajouter des tracas inutiles de votre vie.