Comment puis-je intercepter un appel fgetpos non valide en tant qu'exception C++ sous Windows ?

StackOverflow https://stackoverflow.com/questions/5053977

Question

Dans Visual C++ 2008, je souhaite « attraper » une exception générée comme indiqué ici :

try {
    int foo = 20;
    ::fgetpos(0, (fpos_t*)&foo);
}
//...

Voici les ajustements que j'ai effectués pour tenter une capture réussie :

  1. SEH est activé (/eha)
  2. J'ai ajouté un catch(...)
  3. J'ai ajouté un _set_se_translator vecteur.
  4. J'ai ajouté/ajusté la syntaxe SEH :__essayer / __sauf(EXCEPTION_EXECUTE_HANDLER)

Bref, j'ai essayé "tout ce qui est dans le livre" et je n'arrive toujours pas à trouver l'exception.Si je remplace l'appel à ::fgetpos avec int hey = foo / 0 puis tout à coup, toutes les techniques ci-dessus fonctionnent comme prévu.Donc, l'exception à laquelle je fais face vient de ::fgetpos est en quelque sorte « très spécial ».

Quelqu'un peut-il expliquer pourquoi cette erreur ::fgetpos semble incapable et comment la contourner ?

mise à jour Lorsqu'elle est exécutée dans VS IDE, la fenêtre de sortie ne nomme pas d'exception.Tout ce qu'il dit, c'est ceci :

La bibliothèque d'exécution Microsoft Visual Studio C a détecté une erreur fatale dans MyProgram.exe.

Pas très utile.Lorsque j'exécute l'application console à partir de la ligne de commande, j'obtiens une boîte de dialogue de blocage.La section « Détails du problème » du dialogue comprend ces informations :

Nom de l'événement problématique :BEX
Décalage d'exception : 0002fd30
Code d'exception :c0000417
Données d'exception :00000000
Informations complémentaires 1:69ad
Informations complémentaires 2:69addfb19767b2221c8e3e7a5cd2f4ae
Informations complémentaires 3:b1ff
Informations complémentaires 4:b1ffca30cadddc78c19f19b6d150997f

Était-ce utile?

La solution

Puisque le code dans votre dump correspond à STATUS_INVALID_CRUNTIME_PARAMETER, essayer _set_invalid_parameter_handler

Autres conseils

Très probablement, le moteur d'exécution l'attrape pour vous et émet une boîte de dialogue de débogage sans renvoyer ni propager l'exception - il s'agit d'un appel CRT et ils peuvent y ajouter le code de capture d'exception qu'ils souhaitent.Il est tout à fait dans les droits de Visual Studio d'intercepter une exception matérielle dans une fonction de bibliothèque, en particulier si vous exécutez depuis l'EDI ou en mode débogage, alors c'est attendu du temps d'exécution.

Bien sûr, lorsque vous divisez par zéro, il n'y a pas d'appel de bibliothèque ici pour écrire ce code de capture supplémentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top