Comment lever une exception en C?
J'ai tapé ça dans google, mais seulement trouvé howtos en C++,
comment le faire en C?
- C ne prend pas en charge la gestion des exceptions. Pour lever une exception en C, vous devez utiliser quelque chose de plate-forme spécifique, tel que Win32 de la gestion structurée des exceptions-mais de donner de l'aide pour cela, nous aurons besoin de connaître la plate-forme vous vous souciez.
- ...et ne pas utiliser Win32 gestion structurée des exceptions.
- À l'aide de setjmp() et longjmp() devrait, en théorie, le travail, mais je ne pense pas que cela en vaut la peine.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'exceptions en C. En C, les erreurs sont notifiés par la valeur renvoyée de la fonction, la valeur de sortie du processus, des signaux aux processus (Programme des Signaux d'Erreur (GNU libc)) ou le matériel de PROCESSEUR interruption (ou autre erreur de notification forme le CPU si il y a)(Comment le processeur gère cas de division par zéro).
Exceptions, définies en C++ et en d'autres langues si. La gestion des exceptions en C++ est spécifié dans la norme C++ "S. 15 la gestion des exceptions", il n'y a pas d'article équivalent dans la norme.
main
dans un.c
fichier peut inclure certains C++, et, par conséquent, à l'exception, peut être jeté et pris dans le programme, mais le code C portions rester dans l'ignorance de tout cela passe, sauf cette exception, lancer et attraper reposent souvent sur des fonctions écrites en C, qui se trouvent dans les bibliothèques C++. C est utilisée parce que vous ne pouvez pas le risque de la fonction qui est appelée à fairethrow
avoir besoin de lever une exception de lui-même. Il peut y avoir un compilateur/bibliothèque/cible de manière spécifique pour lancer/attraper les exceptions, cependant. Mais le fait de lancer une instance de classe aura ses propres problèmes.En C, vous pouvez utiliser la combinaison de la
setjmp()
etlongjmp()
fonctions, définies danssetjmp.h
. Exemple de WikipediaRemarque: en fait, je peux vous conseiller pas de les utiliser comme ils le travail horribles avec C++ (les destructeurs des objets locaux ne serait pas appelée) et il est vraiment difficile de comprendre ce qui se passe. De retour d'un certain genre d'erreur à la place.
if()
. Je ne vois pas le danger; puis quelqu'un d'autre ici?Plaine vieux C n'a pas de justifier les exceptions de manière native.
Vous pouvez utiliser d'autres modes de gestion des erreurs de stratégies, telles que:
FALSE
et à l'aide d'unlast_error
variable ou une fonction.Voir http://en.wikibooks.org/wiki/C_Programming/Error_handling.
Il n'y a pas intégré mécanisme d'exception en C, vous devez simuler exceptions et de leur sémantique. Ceci est généralement réalisé en s'appuyant sur
setjmp
etlongjmp
.Il existe assez peu de bibliothèques de partout, et je me suis mise en œuvre de encore un autre. Il est appelé exceptions4c; il est portable et gratuit. Vous pouvez prendre un coup d'oeil, et le comparer à d'autres alternatives pour voir ce qui vous convient le mieux.
C est capable de lancer des exceptions C++, ils sont les codes de machine de toute façon.
Par exemple, dans la barre.c
dans a.cc,
compiler
sortie
http://mentorembedded.github.io/cxx-abi/abi-eh.html a de détails, plus d'infos sur
__cxa_throw
.Je ne suis pas sûr que ce soit portable ou pas, et je l'ai tester avec "gcc 4.8.2' sur Linux.
_ZTII
signifietypeinfo for long
, par exempleecho '_ZTIl' | c++filt
. C'est le g++ modificateur de régime.C n'ont pas d'exceptions.
Il existe différents hacky des implémentations d'essayer de le faire (un exemple au: http://adomas.org/excc/).
Cette question est super vieux, mais je viens de tombé sur elle et j'ai pensé partager une technique: division par zéro, ou déréférencer un pointeur null.
La question est simplement de "comment jeter", et non pas comment l'attraper, ou même la façon de jeter un type spécifique d'exception. J'ai eu une situation il y a des siècles où nous en avions besoin pour déclencher une exception de C à être pris en C++. Plus précisément, nous avons eu des rapports occasionnels de "appel de fonction virtuelle pure" des erreurs, et nécessaire pour convaincre le runtime C est _purecall fonction de jeter quelque chose. Donc, nous avons ajouté nos propres _purecall fonction divisé par zéro, et boom, nous avons obtenu une exception que nous pourrions attraper sur le C++, et même utiliser certains pile amusant de voir où les choses ont mal tourné.
int div_by_nil(int x) { return x/0; }
Sur Win avec MSVC il y a
__try ... __except ...
mais c'est vraiment horrible et que vous ne souhaitez pas l'utiliser si vous pouvez éventuellement éviter. Mieux dire qu'il n'y a pas d'exceptions.Comme mentionné dans un grand nombre de threads, le "standard" de la façon de le faire est d'utiliser setjmp/longjmp. J'ai posté encore une autre solution pour https://github.com/psevon/exceptions-and-raii-in-c
C'est à ma connaissance la seule solution qui s'appuie sur le nettoyage automatique des ressources allouées. Il met en œuvre unique et partagée smartpointers, et permet l'intermédiaire des fonctions de laisser des exceptions passer à travers sans attraper et ont encore leur localement les ressources allouées nettoyés correctement.
C ne supporte pas les exceptions. Vous pouvez essayer de compiler votre code en C qu'en C++ avec Visual Studio ou G++ et voir si ça va compiler comme-est. La plupart des applications C compiler du C++ sans grands changements, et vous pouvez ensuite utiliser le try... catch syntaxe.
Si vous écrivez du code, avec chemin d'accès Joyeux motif de conception (c'est à dire pour des périphériques intégrés), vous pouvez simuler l'exception de traitement d'erreur (aka deffering ou enfin de l'émulation avec l'opérateur "goto".
Il ne fait pas de gestionnaire d'exception, mais il vous permet de gérer l'erreur à fucntion sortie.
P. S. Vous devez être prudent d'utiliser goto que de la même ou plus de profondeur et des étendues ne jamais sauter déclaration de variable.