Question

OK. Je partagerai les cheveux en quatre, mais mon code ne correspondraient pas et je voudrais qu'il en soit ainsi. Mais avant de le faire, je veux vous assurer que je vais dans le bon sens. En pratique, cela n'a pas d'importance, mais cela me tracasse depuis un certain temps, donc je pensais que je demande à mes collègues ...

Chaque fois que j'utilise une déclaration de try... catch, dans le bloc catch je toujours enregistrer un message à ma console interne. Cependant mes messages du journal ne sont pas compatibles. Ils ressemblent soit:

catch(err) {
DFTools.console.log("someMethod caught an error: ",err.message);
...

ou

catch(ex) {
DFTools.console.log("someMethod caught an exception: ",ex.message);
...

Il est évident que les fonctions de code correctement de toute façon, mais il commence à me dérange pas que je me réfère parfois à des « erreurs » et parfois à des « exceptions ». Comme je l'ai dit, peut-être que je suis couper les cheveux, mais qui est le bon terminologie? "Exception" ou "erreur"?

Était-ce utile?

La solution

est un peu subjectif, mais pour moi une erreur est quand quelqu'un ou quelque chose ne va pas quelque chose, une mauvaise ou invalide. Il pourrait être une erreur de syntaxe, une erreur logique, une erreur de lecture, erreur de l'utilisateur, ou même une erreur sociale. Il est un concept abstrait.

Une exception, d'autre part, est un objet qui est créé et renvoyée lorsqu'une certaine condition se produit dans le code. Il peut ou peut ne pas correspondre à une erreur conceptuelle. Donc, pour moi, la nomenclature appropriée est "exception".

Autres conseils

Le spécification ECMAScript les appelle exceptions. Vous pouvez faire de même.

Pour rendre votre exploitation forestière plus d'information:

catch(ex) {
    DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message);

Vous pouvez également garder à l'esprit que les exceptions (malheureusement) peuvent être de tout type, et donc ne pas nécessairement des propriétés de name et message:

catch(ex) {
    if (ex.message && ex.name) {        
        DFTools.console.log("someMethod caught an exception of type " 
           + ex.name + ": ", ex.message);
    } else /* deal with it somehow */

Comme cela commence à ressembler assez lourd à répéter partout, vous pouvez capturer dans une fonction:

function logExceptions(methodName, action) {

    try {

        action();

    } catch (ex) {
        if (ex.message && ex.name) {        
            DFTools.console.log("someMethod caught an exception of type " 
               + ex.name + ": ", ex.message);
        } else {
            DFTools.console.log("someMethod caught a poorly-typed exception: " + ex);
        }
    }
}

Maintenant, vous pouvez dire:

logExceptions(function() {

    // do some risky stuff...

});

En JavaScript, il est appelé erreur de capture. Donc, je vous suggère d'utiliser erreur au lieu d'exception. Laissez le choix au milieu en utilisant « e ». Comme dans les exemples de Mozilla. Mozilla JavaScript 1.5 Référence de base

Exception est quelque chose que vous pouvez attendre par exemple pour tenter d'ouvrir un fichier peut faire face à une « exception Fichier non trouvé ». D'autre part, les erreurs sont quelque chose que vous ne pouvez pas le voir venir comme pile sur les flux ou pas assez de mémoire.

Une exception est une alternative de manière logique sur une large fonction qui ne produit pas un résultat logique. Une exception permet également une meilleure explication de ce qui se passe pourquoi il existe de cette façon. Pour l'ouverture du fichier, encore une fois, une poignée de fichier est un résultat logique et si le fichier est existe pas (une exception possible) ou il est un dossier pas un fichier (une autre exception possible).

AVERTISSEMENT IMPORTANT: Je ne pense pas qu'il y ait une « bonne réponse » à ce sujet. Les opinions exprimées ici sont subjectives et personnelles. Qui plus est que les idées que je suis sur le point d'épouser ne sont utiles que si vous allez faire des choses différentes avec différentes, ahem, défauts ... que vous pourriez utiliser un système d'information selon réponse de Daniel Earwicker. Avec cela à l'esprit:

Je soutiens que « une exception est exceptionnelle ». Une erreur est moins inattendu.

Avertissement: Le pseudo-code suivant n'est pas bon; il ne sert que le cas minimum que je pouvais penser pour illustrer mon point.

Note:. dans cette expérience de pensée, GetFile retourne UNDEFINED si elle ne peut pas trouver le fichier spécifié

function AlwaysGetFile(name){
    var file = null;
    if(FileExists(name)){
        file = GetFile(name);
        if(typeof file === "undefined"){
            throw new "couldn't retrieve file" EXCEPTION
        }
    }
    else{
        throw new "file does not exist" ERROR
    }
    return file;
}

Dans le cas où un consommateur appelle GetFileOrThrow avec un nom de fichier qui n'existe pas, une erreur se produit. A mon avis, la distinction est vraiment que le code de niveau supérieur (ou l'entrée d'utilisateur) est en train de faire quelque chose de mal ... cette fonction doit passer une erreur la ligne à ce code de niveau supérieur qui peut décider quoi faire de ce résultat. Considérez comme ça ... cette fonction serait de dire à toutes les fonctions de consommation:

  

Regardez, mon ami, je sais ce qui se passe ici: il est une erreur de demander BobAccounts.xml, alors ne le faites pas à nouveau! Oh, et si vous pensez que vous savez maintenant ce qui aurait pu mal tourné (avoir abusé de moi), aller de l'avant et essayer de récupérer de celui-ci!

Considérons maintenant le cas où cette fonction prend le nom, vérifie que le fichier existe et pour une raison quelconque ne récupérer. Ceci est une situation différente. Quelque chose de vraiment inattendu est arrivé. De plus, le code consommation est de ne pas blâmer . Maintenant, nous voulons vraiment cette fonction pour dire à toutes les fonctions de consommation:

  

Oh balivernes! Désolé à ce sujet, je vous demande humblement pardon, mais quelque chose EXCEPTIONNEL que je ne comprends pas vraiment qui a mal tourné. Je ne pense pas que votre demande de BobAccounts.xml était déraisonnable ... et je sais que je devrais le remplir pour vous. Depuis que je suis inférieur code de niveau que vous, je devrais vraiment savoir ce qui se passe ... mais je ne sais pas ... et je pense que vous auriez probablement parce que vous avez moins de chance que moi de comprendre cette situation EXCEPTIONNELLE mieux arrêter tout ce que vous faites et laisser ce message aller tout le chemin vers le sommet ... Je veux dire, il y a quelque chose sérieusement anguille sous roche.

Je suppose que mon résumé: Si l'erreur est arrivé dans le code d'ordre supérieur (vous passé de mauvaises données) une erreur. Si l'erreur est arrivé dans le code d'ordre inférieur (fonction vous dépendez pas d'une manière que vous ne comprenez pas et ne pouvait pas planifier pour) lancer une exception ... et si l'erreur est arrivé dans la fonction vous êtes actuellement en train d'écrire .. . bien, duh, si vous êtes au courant, puis le corriger!

Et enfin, pour répondre à la question initiale plus directement: En ce qui concerne la manipulation et ERREURS EXCEPTIONS, mon conseil serait: Manipulez toutes les erreurs grâce (en option les enregistrer) ... mais soigneusement gérer EXCEPTIONS en effet; essayez seulement de récupérer d'une exception si vous êtes vraiment sûr que vous savez ce qu'il est et pourquoi il est arrivé, sinon laissez bouillonner (rethrowing si vous devez).

Qu'est-ce que vous obtenez dans un bloc Catch est une exception, donc je nommer comme une exception ...

S'il est une erreur - je peux le manipuler dans mon code et je ne pense pas habituellement voir dans le bloc Catch

HTH.

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