Comment puis-je attraper tous les types d'exceptions dans un bloc catch?
En C++, je suis en train d'essayer d'attraper tous les types d'exceptions dans un piège (comme catch(Exception)
en C#). Comment est-il fait? Et en plus, comment peut-on attraper une division par zéro exceptions?
source d'informationauteur gil
Vous devez vous connecter pour publier un commentaire.
Considérations importantes:
Vous ne pas voulez être à l'aide de catch (...) (c'est à dire l'attraper avec les points de suspension), à moins que vous vraiment, vraiment, la plupart des prouvable en avons besoin.
La raison pour cela est que certains compilateurs (Visual C++ 6 le nom de la plus commune) également activer les erreurs comme la segmentation des défauts et d'autres très mauvaises conditions dans les exceptions que vous pouvez volontiers la poignée à l'aide de catch (...). C'est très mauvais, parce que vous ne voyez pas le bloque plus.
Et techniquement, oui, vous pouvez également prendre de division par zéro (vous aurez à "StackOverflow" pour ça), mais vous devriez vraiment être en évitant de faire de ces divisions, en premier lieu.
Au lieu de cela, procédez de la manière suivante:
Si vous êtes sur windows et la nécessité de gérer les erreurs comme la division par zéro et la violation d'accès vous pouvez utiliser une exception structurée traducteur. Et puis à l'intérieur de votre traducteur, vous pouvez jeter une des exceptions c++:
Note, le code va vous dire ce que l'erreur a été. Aussi, vous devez compiler avec l'option de /EHa (C/C++ -> Code Generatrion -> Activer le C/C++ Exceptions = Oui avec SEH Exceptions).
Si cela ne fait pas sens la caisse de la documentation pour [_set_se_translator](http://msdn.microsoft.com/en-us/library/5z4bw5h5(SV.80).aspx)
Si attraper toutes les exceptions, y compris l'OS est vraiment ce dont vous avez besoin, vous avez besoin de prendre un coup d'oeil à votre compilateur et de l'OS. Par exemple, sur Windows, vous avez probablement "__essayer" mot-clé ou commutateur de compilateur pour faire "try/catch" catch SEH exceptions, ou les deux.
Faire toutes les classes d'exceptions héritent de std::exception, alors vous pouvez simplement attraper std::exception. Voici un exemple de code:
En C++, la norme ne définit pas une division par zéro exception, et les mises en œuvre ont tendance à ne pas les jeter.
Vous pouvez, bien sûr, utiliser
catch (...) { /* code here */}
mais cela Dépend vraiment de Ce que Vous Voulez Faire. En C++, vous avez déterministe destructeurs (aucun des que la finalisation des ordures), donc si vous voulez éponger la bonne chose à faire est d'utiliser RAII.Par exemple. au lieu de:
Faire quelque chose comme:
Créer votre propre classe avec un destructeur si vous n'utilisez pas de coup de pouce.
Si je me souviens bien (ça fait un moment depuis que j'ai regardé, C++), je pense que la suite devrait faire l'affaire
et un rapide google(http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html) semble prouver me corriger.