IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[CodeSharing] Gestionnaire d'erreurs. Avis ?


Sujet :

JavaScript

  1. #1
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    D�cembre 2010
    Messages
    1 009
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : sans emploi

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 1 009
    Par d�faut [CodeSharing] Gestionnaire d'erreurs. Avis ?
    Code js : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    // by dessy boris
    // for test just include jQuery in a html page and this file(name it : "handler.js")
    // sample like this :
    /*
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script type="text/javascript" src="handler.js"></script>
    */
    // welcome ^^
     
    var handler = {
    		log : function(msg,type){
    				var p = type=='function'?'()':'';	
    				console.log(type+' : '+handler.level+msg+p);
    				// logFile isn't used here, but you can use for send packet with all log to your server via ajax.
    				handler.logFile.push(type+':'+msg);
    		},
    		exception : function(err,o,arg,name,f){
    				handler.log(err,'## error');
    				// -- you can do lot of things to handle your error here
    				//-----------------
    				// fn.name = name;
    				// fn = f;
    				// fn.caller =  arguments.callee.caller.caller
    				// object = o;
    				// arguments = arg;
    				// error = err;
    				//-----------------
    		},
    		create : function(f,name){	
    				// return a new function to replace original
    				return function(){
    					// log function call
    					handler.log(name,'function');
    					// increment deep level of call
    					handler.level += '--';
    					// make the call and catch(+log) error
    					try{ 	var r = f.apply(this,arguments);	}
    					catch(e){	 handler.exception(e,this,arguments,name,f);		}
    					// decrement deep level of call
    					handler.level = handler.level.substr(2);
    					// return value of call
    					return r;
    				};
    		},
    		init : function(o,restrict){
    				handler.log('_begin','handling');
    				// browse all functions of the object (except the restricted)
    				for(var i in o) if(typeof o[i] == 'function') if(!restrict || restrict[i]==undefined){
    					// overwrite each function with new
    					o[i] = handler.create(o[i],i);	
    				}
    				handler.log('_end','handling');	
    		},
    		logFile : [],
    		level : ''
    };
     
    myOwnFn = {};
     
     
    $(document).ready(function() {
    	// create console if none is define		   
    	if(!window.console){
    		window.console = document.createElement('div');
    		console.setAttribute('style','position:absolute;top:0;right:0;height:150px;width:400px;border:solid black 1px;overflow:auto;background-color:white;');
    		console.innerHTML = '<b>CONSOLE:</b><br/>';
    		document.body.appendChild(console);
    		console.log = function(msg){this.innerHTML += '-'+msg+'<br/>';this.scrollTop=999999;};
    	}
    	console.log('console : initialized');
     
     
    	// SAMPLES :
     
    	// handling myOwnFn
    	handler.init(myOwnFn);
     
    	// handling jQuery.fn
    	handler.init(jQuery.fn,{init:1});
     
    	// sample of use (of jQuery)
    	$('<div id="test">hello world(click me)</div>').appendTo('body');
    	$('#test').click(	function(){	$('#test').fadeOut();}		);
    });

    Voila, je viens de coder �a en une petite heure (donc, oui, il y a encore certainement plein d'erreurs.)

    Mais je voudrais connaitre votre avis sur ce bout de code ? Int�ressant ? Inutile ? Toutes critiques seront les bienvenues.

    Pour le tester, ajoutez simplement jQuery et ce bout de code � une page vierge. (sous Chrome, j'utilise la console du navigateur, pour les autres je cr�� un div qui affiche les logs.)

    Evidement, dans certains cas, certaines fonctions ne pourront pas �tre remplac�es pour diverses raisons. (appel au "caller" ou utilisation de variables locales ou que sais-je?). Pour ce faire, j'ai pr�vu un param�tre qui permet de sp�cifier les fonctions qu'on ne souhaite pas remplacer. Comme par exemple la fonction "init" de jQuery.fn qui faisait planter le bazar. (mais justement gr�ce � ce gestionnaire d'erreurs, j'ai pu voir directement la fonction qui posait probl�me ! l'est pas belle la vie ? )


  2. #2
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    D�cembre 2010
    Messages
    1 009
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : sans emploi

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 1 009
    Par d�faut
    premi�re correction :
    la surcharge de la fonction "init()" de jQuery ne fonctionnait pas car elle �tait appel�e par un "new". j'ai donc rajout� la gestion des fonction "constructeurs" qui instancient de nouveaux objets :

    CODE CORRIGE:
    Code js : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    // by dessy boris
    // for test just include jQuery in a html page and this file(name it : "handler.js")
    // sample like this :
    /*
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script type="text/javascript" src="handler.js"></script>
    */
    // welcome ^^
     
    var handler = {
    		log : function(msg,type){
    				var p = type=='function'?'()':'';	
    				console.log(type+' : '+handler.level+msg+p);
    				// logFile isn't used here, but you can use for send packet with all log to your server via ajax.
    				handler.logFile.push(type+':'+msg);
    		},
    		exception : function(err,o,arg,name,f){
    				handler.log(err,'## error');
    				// -- you can do lot of things to handle your error here
    				//-----------------
    				// fn.name = name;
    				// fn = f;
    				// fn.caller =  arguments.callee.caller.caller
    				// object = o;
    				// arguments = arg;
    				// error = err;
    				//-----------------
    		},
    		create : function(f,name){	
    				// return a new function to replace original
    				return function(){
    					// log function call
    					handler.log(name,'function');
    					// increment deep level of call
    					handler.level += '--';
    					// make the call and catch(+log) error
    					try{ 	var r = f.apply(this,arguments);	}
    					catch(e){	 handler.exception(e,this,arguments,name,f);	}
    					// decrement deep level of call
    					handler.level = handler.level.substr(2);
    					// return value of call
    					return r;
    				};
    		},
    		init : function(o,restrict){
    				handler.log('_begin','handling');
    				var f;
    				// browse all functions of the object (except the restricted)
    				for(var name in o) if(typeof o[name] == 'function') if(!restrict || restrict[name]==undefined){
    					f=o[name];
    					// overwrite each function with new
    					o[name] = handler.create(f,name);	
    					o[name].prototype = f.prototype;
    				}
    				handler.log('_end','handling');	
    		},
    		logFile : [],
    		level : ''
    };
     
    myOwnFn = {
    	initPage : function(){		
    		$('<div id="test">hello world(click me)</div>').appendTo('body');
    		$('#test').click(	function(){	$('#test').fadeOut();}		);
    	}
    };
     
    $(document).ready(function() {
    	// create console if none is define		   
    	//if(!window.console){
    		window.console = document.createElement('div');
    		console.setAttribute('style','position:absolute;top:0;right:0;height:150px;width:400px;border:solid black 1px;overflow:auto;background-color:white;');
    		console.innerHTML = '<b>CONSOLE:</b><br/>';
    		document.body.appendChild(console);
    		console.log = function(msg){this.innerHTML += '-'+msg+'<br/>';this.scrollTop=999999;};
    	//}
    	console.log('console : initialized');
     
     
    	// SAMPLES :
     
    	// handling myOwnFn
    	handler.init(myOwnFn);
     
    	// handling jQuery.fn
    	handler.init(jQuery.fn);
     
    	// sample of use (of jQuery)
    	myOwnFn.initPage();
    });


    ps: jQuery n'est qu'un exemple de surcharge ici, mon code n'utilise pas jQuery. [smile][/i][/i][/i][/i]

  3. #3
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    D�cembre 2010
    Messages
    1 009
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : sans emploi

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 1 009
    Par d�faut
    Franchement, vous ne pensez pas que �a pourrait faciliter le d�bogage de codes poss�dant beaucoup de fonctions ?

    Moi, je pense qu'en l'am�liorant un peu, ce code pourrait �tre vraiment utile ... je pourrais en cr�er un article/source/tuto sur ce site, non ?

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Par d�faut
    Citation Envoy� par Willpower Voir le message
    Franchement, vous ne pensez pas que �a pourrait faciliter le d�bogage de codes poss�dant beaucoup de fonctions ?

    Moi, je pense qu'en l'am�liorant un peu, ce code pourrait �tre vraiment utile ... je pourrais en cr�er un article/source/tuto sur ce site, non ?
    Le d�bogage de javascript ne se fait pas � coup de console.log ou console.info ou d�tection des erreurs et affichage dans une console (div ou console du navigateur)

    Soit tu active le "break on error" de firefox pour qu'il colle automatiquement un point d'arr�t dans le code. ou alors tu colles toi m�me ton point d'arr�t.
    Ainsi comme un vrai d�veloppeur tu pourras regarder la pile de fonction, les variables ou autres qui sont visibles dans le scope de la fonction.

    Et les points d'arr�ts on peut en mettre sous :
    Chrome, Safari, Firefox (firebug), IE8+, pour IE6 et 7 il faut le MS Script debugger qui est livr� avec MS Office. Pour Opera je ne sais pas, je n'ai jamais besoin de d�bugger avec quand j'ai d�bugg� dans les premiers si erreur il y a.

  5. #5
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    D�cembre 2010
    Messages
    1 009
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : sans emploi

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 1 009
    Par d�faut
    Citation Envoy� par dukej Voir le message
    Le d�bogage de javascript ne se fait pas � coup de console.log ou console.info ou d�tection des erreurs et affichage dans une console (div ou console du navigateur)

    Soit tu active le "break on error" de firefox pour qu'il colle automatiquement un point d'arr�t dans le code. ou alors tu colles toi m�me ton point d'arr�t.
    Ainsi comme un vrai d�veloppeur tu pourras regarder la pile de fonction, les variables ou autres qui sont visibles dans le scope de la fonction.

    Et les points d'arr�ts on peut en mettre sous :
    Chrome, Safari, Firefox (firebug), IE8+, pour IE6 et 7 il faut le MS Script debugger qui est livr� avec MS Office. Pour Opera je ne sais pas, je n'ai jamais besoin de d�bugger avec quand j'ai d�bugg� dans les premiers si erreur il y a.
    Okay, j'avoue que je ne m'y connais pas �normement en javascript.

    Mais en fait, ce serait surtout pour faire un gros site en ajax (dans le genre facebook qui appelle en permanence des fonctions JS pour des refresh via serveur) et je me dis qu'il pourrait en ressortir des bugs "inconnus"(du developpeur) qui pourraient par exemple �tre logg�s sur le serveur et ainsi faciliter leurs d�tections et leurs corrections. Mon id�e est mauvaise ?

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Par d�faut
    Citation Envoy� par Willpower Voir le message
    Okay, j'avoue que je ne m'y connais pas �normement en javascript.

    Mais en fait, ce serait surtout pour faire un gros site en ajax (dans le genre facebook qui appelle en permanence des fonctions JS pour des refresh via serveur) et je me dis qu'il pourrait en ressortir des bugs "inconnus"(du developpeur) qui pourraient par exemple �tre logg�s sur le serveur et ainsi faciliter leurs d�tections et leurs corrections. Mon id�e est mauvaise ?
    Dans un sens tu n'as pas tord de faire �a, car d�bugger une boucle for c'est chiant, et on est bien content d'avoir un logger pour ensuite analyser le bordel

    Mais sinon, regarde du cot� de : http://getfirebug.com/firebuglite

Discussions similaires

  1. Gestionnaire d'erreurs personnalis�
    Par joboy84 dans le forum Langage
    R�ponses: 3
    Dernier message: 23/05/2009, 15h13
  2. Gestionnaire d'erreur globale
    Par ToxiZz dans le forum VBA Access
    R�ponses: 2
    Dernier message: 27/06/2008, 22h32
  3. gestionnaire d'erreur et fatal_error
    Par beberem dans le forum Langage
    R�ponses: 6
    Dernier message: 26/12/2007, 21h49
  4. R�ponses: 2
    Dernier message: 11/02/2007, 13h11
  5. Gestionnaire d'erreurs
    Par rvzip64 dans le forum Langage
    R�ponses: 6
    Dernier message: 04/11/2004, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo