Il semble que je sois un peu en retard :), mais la discussion est assez intéressante alors... voilà... En supposant que vous voulez construire un gestionnaire d'erreur, et vous utilisez votre propre classe de gestionnaire d'exception comme :
function errorHandler(error){
this.errorMessage = error;
}
errorHandler.prototype. displayErrors = function(){
throw new Error(this.errorMessage);
}
Et tu enveloppes ton code comme ça :
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message');
}
}catch(e){
e.displayErrors();
}
Il est fort probable que le gestionnaire d'erreurs se trouve dans un fichier .js distinct.
Vous remarquerez que dans la console d'erreur de Firefox ou de Chrome, le numéro de ligne de code (et le nom du fichier) affiché est la ligne (le fichier) qui lance l'exception 'Error' et non l'exception 'errorHandler', ce que vous voulez vraiment pour faciliter le débogage. Lancer ses propres exceptions, c'est bien, mais sur les grands projets, les localiser peut être un problème, surtout si elles ont des messages similaires. Donc, ce que vous pouvez faire est de passer une référence à un objet Error vide à votre gestionnaire d'erreur, et cette référence contiendra toutes les informations que vous voulez (par exemple, dans Firefox, vous pouvez obtenir le nom du fichier, et le numéro de ligne etc ; dans Chrome, vous obtenez quelque chose de similaire si vous lisez la propriété 'stack' de l'instance Error). Pour faire court, vous pouvez faire quelque chose comme ceci :
function errorHandler(error, errorInstance){
this.errorMessage = error;
this. errorInstance = errorInstance;
}
errorHandler.prototype. displayErrors = function(){
//add the empty error trace to your message
this.errorMessage += ' stack trace: '+ this. errorInstance.stack;
throw new Error(this.errorMessage);
}
try{
if(condition){
//whatever...
}else{
throw new errorHandler('Some Error Message', new Error());
}
}catch(e){
e.displayErrors();
}
Vous pouvez maintenant obtenir le fichier réel et le numéro de ligne qui a déclenché votre exception personnalisée.
2 votes
Je ne pense pas que cela soit possible dans IE, sinon nous aurions un moyen de contourner ces messages d'erreur CRAPPY qui ne donnent aucun détail. Mais si c'est possible, j'aimerais bien le savoir aussi !
0 votes
Oui. Voici une fonction inter-navigateurs qui utilise les méthodes propres à chaque navigateur : github.com/eriwen/javascript-stacktrace [lien fixe]