100 votes

Attraper les exceptions de violation d'accès ?

Exemple

int *ptr;
*ptr = 1000;

Puis-je attraper une exception de violation d'accès à la mémoire en utilisant le C++ standard sans utiliser de logiciel spécifique à Microsoft ?

9voto

Damien Points 90

Comme indiqué, il n'y a pas de moyen autre que Microsoft ou le fournisseur de compilateurs pour faire cela sur la plate-forme Windows. Cependant, il est évidemment utile d'attraper ces types d'exceptions dans la méthode normale try { } catch (exception ex) { } pour le signalement des erreurs et une sortie plus gracieuse de votre application (comme le dit JaredPar, l'application est maintenant probablement en difficulté). Nous utilisons _se_translator_function dans un simple wrapper de classe qui nous permet d'attraper les exceptions suivantes dans un try handler :

DECLARE_EXCEPTION_CLASS(datatype_misalignment)
DECLARE_EXCEPTION_CLASS(breakpoint)
DECLARE_EXCEPTION_CLASS(single_step)
DECLARE_EXCEPTION_CLASS(array_bounds_exceeded)
DECLARE_EXCEPTION_CLASS(flt_denormal_operand)
DECLARE_EXCEPTION_CLASS(flt_divide_by_zero)
DECLARE_EXCEPTION_CLASS(flt_inexact_result)
DECLARE_EXCEPTION_CLASS(flt_invalid_operation)
DECLARE_EXCEPTION_CLASS(flt_overflow)
DECLARE_EXCEPTION_CLASS(flt_stack_check)
DECLARE_EXCEPTION_CLASS(flt_underflow)
DECLARE_EXCEPTION_CLASS(int_divide_by_zero)
DECLARE_EXCEPTION_CLASS(int_overflow)
DECLARE_EXCEPTION_CLASS(priv_instruction)
DECLARE_EXCEPTION_CLASS(in_page_error)
DECLARE_EXCEPTION_CLASS(illegal_instruction)
DECLARE_EXCEPTION_CLASS(noncontinuable_exception)
DECLARE_EXCEPTION_CLASS(stack_overflow)
DECLARE_EXCEPTION_CLASS(invalid_disposition)
DECLARE_EXCEPTION_CLASS(guard_page)
DECLARE_EXCEPTION_CLASS(invalid_handle)
DECLARE_EXCEPTION_CLASS(microsoft_cpp)

Le cours original provient de cet article très utile :

http://www.codeproject.com/KB/cpp/exception.aspx

8 votes

Je constate que l'utilisation d'un compilateur Microsoft est traitée de la même manière qu'une instruction illégale ou une violation d'accès. Intéressant.

3voto

Loki Astari Points 116129

Pas le mécanisme de traitement des exceptions, Mais vous pouvez utiliser le mécanisme signal() qui est fourni par le C.

> man signal

     11    SIGSEGV      create core image    segmentation violation

L'écriture sur un pointeur NULL va probablement provoquer un signal SIGSEGV.

-1voto

David Thornley Points 39051

Une violation de ce type signifie que le code présente un sérieux problème et qu'il n'est pas fiable. Je peux comprendre qu'un programme puisse vouloir essayer de sauvegarder les données de l'utilisateur d'une manière qui, on l'espère, n'écrira pas sur les données précédentes, dans l'espoir que les données de l'utilisateur ne soient pas déjà corrompues, mais il n'existe pas, par définition, de méthode standard pour gérer un comportement non défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X