mécanismes de gestion des erreurs

mécanismes de gestion des erreurs - Divers - Programmation

Marsh Posté le 30-10-2002 à 00:18:17    

Bon, je recherche pas de code, ni quoi que ce soit, juste des idées. Alors je vais recapituler ce que je connais, et si vous avez des trucs a ajouter ca serait sympa de le faire.
 
- méthode primitive :  
une fonction renvoie une valeur, et on se base sur celle ci pour savoir si une erreur a eu lieu.
 
- methode un peu plus descriptive :
comme la primitive, mais un code d'erreur est renseigné dans une variable globale (errno en C)
 
- goto :
basic style, on error goto truc, et on a aussi un numero d'erreur
 
- exceptions simples (goto amélioré)
cas de PL/SQL, les exceptions sont en fait des labels, vers lesquels on saute en cas d'erreur.
 
- exceptions
cas de la plupart des langages modèrnes, une fonction renvoi un objet un peu particulier qui contient un descriptif de l'erreur.
 
Alors en fait, ma question, c'est est-ce qu'il y a encore plus évolué que les exceptions ? Et si oui, avez vous des docs la dessus ?


Message édité par lorill le 30-10-2002 à 00:19:17
Reply

Marsh Posté le 30-10-2002 à 00:18:17   

Reply

Marsh Posté le 30-10-2002 à 00:35:50    

lorill a écrit a écrit :

Bon, je recherche pas de code, ni quoi que ce soit, juste des idées. Alors je vais recapituler ce que je connais, et si vous avez des trucs a ajouter ca serait sympa de le faire.
 
- méthode primitive :  
une fonction renvoie une valeur, et on se base sur celle ci pour savoir si une erreur a eu lieu.
 
- methode un peu plus descriptive :
comme la primitive, mais un code d'erreur est renseigné dans une variable globale (errno en C)
 
- goto :
basic style, on error goto truc, et on a aussi un numero d'erreur
 
- exceptions simples (goto amélioré)
cas de PL/SQL, les exceptions sont en fait des labels, vers lesquels on saute en cas d'erreur.
 
- exceptions
cas de la plupart des langages modèrnes, une fonction renvoi un objet un peu particulier qui contient un descriptif de l'erreur.
 
Alors en fait, ma question, c'est est-ce qu'il y a encore plus évolué que les exceptions ? Et si oui, avez vous des docs la dessus ?




 
dans certain projet il est interessant de connaitre la source du plantage, la fonction ou le script qui appelle la fonction qui plante.
 

Reply

Marsh Posté le 30-10-2002 à 00:37:17    

barbarella a écrit a écrit :

 
dans certain projet il est interessant de connaitre la source du plantage, la fonction ou le script qui appelle la fonction qui plante.




ben dans les systèmes avec exception, c'est ce que j'appelle le descriptif de l'erreur. Y'a moyen d'avoir ces infos avec d'autres systèmes ?

Reply

Marsh Posté le 30-10-2002 à 00:51:22    

Oui, avec des "assertion"
 
Avec ca tu as la ligne d'erreur dans ton source directement, pratique quand tu distribues un soft.  
 


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 00:52:23    

Voila ce que ca donne en pascal
 
 

Citation :

Tests whether a Boolean expression is true.
 
Unit
 
System
 
Category
 
miscellaneous routines
 
procedure Assert(expr : Boolean [; const msg: string]);
 
Description
 
Use Assert as a debugging tool to test that conditions assumed to be true are never violated. Assert provides an opportunity to intercept an unexpected condition and halt a program rather than allow execution to continue under unanticipated conditions.
 
Assert takes a Boolean expression and an optional message string as parameters. If the Boolean test fails, Assert raises an EAssertionFailed exception. If a message string was passed to Assert, the exception object is created with that string. Otherwise it is created with a default string indicating that the assertion failed. The message is displayed along with the complete path, filename, and the line number on which Assert failed.
 
The SysUtils unit causes runtime errors to be turned into exceptions. If SysUtils is not used anywhere in your application, you will get a runtime error 227 rather than an EAssertionFailed exception. This runtime error will halt the program.
 
Because assertions are not usually used in shipping versions of a product, compiler directives are provided to disable the generation of assertion code:
 
$ASSERTIONS ON/OFF (long form)
$C +/- (short form)
 
These are global switches that affect the entire source file where they occur, regardless of their position in the file. It is not possible to enable and disable assertions for something smaller than a source file. Assertions are on by default.


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 00:55:46    

zion a collé une doc sur les assertions a écrit :

 




 
Merci, mais c'est plus de la prévention en fait.
En gros, ca teste, et si c'est faux une exception est lancée. Rien de bien extraordinaire, donc.

Reply

Marsh Posté le 30-10-2002 à 00:57:20    

Ah si, tu sais dans quel source et à quelle ligne tu as un problème, pas besoin de te casser les burnes pour savoir ou tu as balancé l'exception.


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 00:58:31    

zion a écrit a écrit :

Ah si, tu sais dans quel source et à quelle ligne tu as un problème, pas besoin de te casser les burnes pour savoir ou tu as balancé l'exception.




Ben ca java le fait aussi, python aussi, ruby aussi, et sans doute pas mal d'autre. En fait doit y avoir que C++ qui le fait pas (et j'en suis même pas sur) :D

Reply

Marsh Posté le 30-10-2002 à 00:59:23    

Ouai, enfin ici tu as une distinction entre excpetion et assertion.  Tu veux qu'on parle mécanisme de gestion des erreurs, donc on parle  :kaola:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 01:02:18    

zion a écrit a écrit :

Ouai, enfin ici tu as une distinction entre excpetion et assertion.  Tu veux qu'on parle mécanisme de gestion des erreurs, donc on parle  :kaola:  




te fâche pas, va :)
 
n'empeche que assert(toto == tata) c'est la même chose que if(toto != tata) throw new AssertionException("message" ), non ?
 
donc d'un point de vue implémentation c'est juste une instruction supplémentaire, j'ai bon ?

Reply

Marsh Posté le 30-10-2002 à 01:02:18   

Reply

Marsh Posté le 30-10-2002 à 01:06:33    

lorill a écrit a écrit :

 
n'empeche que assert(toto == tata) c'est la même chose que if(toto != tata) throw new AssertionException("message" ), non ?




 
Benh non, une exception tu sais pas ou elle a été balancée (oui en java, gnagnagna), mais sur le principe, si il te dit la ligne exacte ou a été balancée l'exception, je m'en fous, moi je veux savoir ou elle a été causée plutot (genre un double free, je veux que ca plante la ou je tape le free, pas dans le free).
 
Et ici, l'assertion ca te permet de prévenir et le compilo gère pour toi la ligne et tout le toutim.  
 
Mais a part les exceptions/assertions, je vois rien de mieux  :sweat:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 01:11:11    

ok, donc en fait ca permet de pallier au manque d'infos disponibles pour les langages compilés si je comprends bien.  
Pour ton info, dans le cas des langages que j'ai cité, tu n'as pas que la ligne où a été créée l'exception, mais tout le chemin qu'elle a parcouru.

Reply

Marsh Posté le 30-10-2002 à 01:16:10    


Euh, ca, tu sais aussi l'avoir ici, le groupe pour lequel je bosse quand j'ai un peu de temps libre a fait un compo pour ca... Tu le balances sur ton application, il récupère les appels sur le stack, les valeurs des registres, etc, etc, et il propose un joli dialogue pour envoyer un mail.
 
Je devrais l'utiliser tiens  :ange:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 09:21:06    

Les assertion ca marche qu'en debug il me semble ... pas sur la version du client.
Sinon y'a le core dump. Le client te l'envoit, tu lances ton debuggueur et te voila sur l'erreur.
Y'a les signaux sous Unix, le SEH sous Windows, ...
Y'a les watchdog aussi. C'est utilisé dans les systèmes embarqués ou personne n'est là pour faire un reset. Si une boucle infinie bloque trop longtemps fiout on reset !
Justement, j'ai récemment eu mon premier ecran bleu WinXP ... mon ordi a freezé et puis au bout d'une dizaines de secondes, ecran bleu, le watchdog me dit ou a eu lieu l'erreur. Pas mal !
http://www.chez.com/regatbar/bsod%20xp/BSOD_XP.htm


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-10-2002 à 09:23:38    

zion a écrit a écrit :

et il propose un joli dialogue pour envoyer un mail.
 
Je devrais l'utiliser tiens  :ange:  




 
c'est quel compo :??: je devrais l'utiliser aussi :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-10-2002 à 14:51:27    

antp a écrit a écrit :

 
 
c'est quel compo :??: je devrais l'utiliser aussi :D




 
Je sais plus, c'est dans la JCL. JclDebug je dirais  :)  
 
Sinon si, les assertions ca marche sur la version finale de l'utilisateur aussi, bien qu'on préfère les désactiver vu que le mec il est pas censé avoir ce genre d'informations  :D  
 
Sinon y a aussi le remote debug avec Delphi, j'ai pas encore eu le temps de tester mais ca a l'air sympa...


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-10-2002 à 15:51:23    

lorill> Ta description des différents mécanismes d'erreur me semble incomplète, car le mécanisme de récupération sur erreur est aussi important que le mécanisme de déclenchement de l'erreur. C'est même le mécanisme de récupération qui différencie ces mécanismes et rend l'un meilleur que l'autre.
 
Ainsi, normalement, une assertion est irrécupérable : le programme s'arrête si elle n'est pas vérifiée, point (Java est un mauvais exemple en matière d'assertion, puisqu'il l'assimile à une exception).
 
Par ailleurs, le ON ERROR GOTO ou ON ERROR GOSUB du BASIC, suivi d'un RESUME pour revenir au mode de fonctionnement normal, est très différent du mécanisme des exceptions, puisque l'instruction RESUME va tenter de ré-exécuter l'instruction qui a déclenché l'erreur. Alors que pour les exceptions, on quitte le code en cours pour aller directement à l'appelant (ou le bloc traite-exception encapsulant).
 
Pour finir et pour répondre à la dernière question de ton premier post, à ma connaissance, il n'y a pas actuellement de mécanisme de récupération sur erreur plus souple (et ausii simple) que celui qu'offre les exceptions.

Reply

Marsh Posté le 30-10-2002 à 15:59:10    

BifaceMcLeOD a écrit a écrit :

 




Merci, c'est vrai que j'ai complétement occulté les différences en ce qui concerne le retour au code après erreur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed