Attraper les exceptions de violation d'accès?
Exemple
int *ptr;
*ptr = 1000;
que je peux prendre de la mémoire exception de violation d'accès à l'aide de la norme C++ sans utiliser de microsoft.
Vous devez vous connecter pour publier un commentaire.
Nope. C++ ne permet pas de lever une exception lorsque vous faites quelque chose de mauvais, qui entraînerait un gain de performance. Des choses comme des violations d'accès ou la division par zéro les erreurs sont plus comme "machine" exceptions près, plutôt que de la langue au niveau des choses que vous pouvez attraper.
Lire et pleurer!
J'ai tout compris. Si vous ne les jetez pas à partir du gestionnaire, le gestionnaire de continuer et ne sera donc l'exception.
La magie qui se passe quand vous vous jeter propre exception et poignée.
sigaltstack
) installé (sauf les exceptions C++ déroulement de la mise en œuvre permet), et à chaque exécution de la fonction de la manipulation du déroulement mécanisme en lui-même devrait être un signal à la sécurité.signal(SIGSEGV, SIG_DFL);
Il y a un moyen très facile à attraper toute sorte d'exception (division par zéro, de violation d'accès, etc.) dans Visual Studio utilisation de try -> catch (...) de bloc. Un projet mineur modification des réglages est assez. Il suffit d'activer /EHa option dans les paramètres du projet. Voir Propriétés du Projet -> C/C++ -> Génération de Code -> Modifier l'Activer C++ Exceptions "Oui Avec la gestion structurée des exceptions les Exceptions". Ça y est!
Voir plus de détails ici:
http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs. 80).aspx
Ce type de situation est dépendant de l'implémentation et, par conséquent, il aura besoin d'un fournisseur de mécanisme spécifique afin de les piéger. Avec Microsoft cela impliquera SEH, et *nix impliquera un signal
En général, bien que l'interception d'une exception de Violation d'Accès est un très mauvaise idée. Il n'y a presque aucun moyen de les récupérer à partir d'un AV exception et d'essayer de le faire ne fera que mener à plus difficile de trouver des bugs dans votre programme.
catch
gestionnaire pourrait faire quelque chose de frai, y compris la redoutable nasale démon et effacer votre disque dur.Comme indiqué, il n'est pas non Microsoft /fournisseur de compilateur façon de le faire sur la plate-forme windows. Toutefois, il est évidemment utile pour attraper ces types d'exceptions à la normale try { } catch (exception ex) { } moyen de rapports d'erreurs et plus de douceur à la sortie de votre application (comme JaredPar dit, l'application est sans doute aujourd'hui en difficulté). Nous utilisons _se_translator_function dans une classe simple wrapper qui nous permet d'attraper les exceptions suivantes dans un un essayez gestionnaire:
De la classe d'origine est venu de cet article très utile:
http://www.codeproject.com/KB/cpp/exception.aspx
Au moins pour moi, le
signal(SIGSEGV ...)
approche mentionné dans une autre réponse ne fonctionne pas sur Win32 avec Visual C++ 2015. Ce ne travail pour moi a été d'utiliser_set_se_translator()
trouvé danseh.h
. Il fonctionne comme ceci:Étape 1) assurez-vous d'activer Oui avec la gestion structurée des exceptions les Exceptions (/EHa) dans Propriétés du Projet /C++ /Génération de Code /Activer les Exceptions C++, comme mentionné dans la réponse Volodymyr Frytskyy.
Étape 2) Appel
_set_se_translator()
, en passant un pointeur de fonction (ou lambda) pour la nouvelle exception traducteur. Il est appelé un traducteur parce qu'il est fondamentalement juste prend le faible niveau de l'exception et de la re-lance comme quelque chose de plus facile à attraper, commestd::exception
:Étape 3) intercepter l'exception comme vous le feriez normalement:
Pas l'exception d'un mécanisme de gestion,
Mais vous pouvez utiliser le signal() mécanisme qui est fourni par le C.
Écrit à un pointeur NULL est probablement à cause d'un signal SIGSEGV
Une violation comme cela signifie qu'il ya quelque chose de mal avec le code, et c'est peu fiable. Je peux voir qu'un programme pourrait vouloir pour essayer de sauver les données de l'utilisateur dans une manière que l'on espère ne pas écrire plus de données précédentes, dans l'espoir que les données de l'utilisateur n'est pas déjà corrompu, mais il n'y a par définition pas de méthode standard de traiter avec un comportement indéfini.