web-dev-qa-db-fra.com

"lancer un nouvel avertissement" en JavaScript?

En ce moment, j'étends mon projet JavaScript avec la gestion des erreurs. L'instruction throw joue ici un rôle important:

throw new Error("text"); // Error: text

Cependant, puis-je également lancer un avertissement? J'ai essayé ce qui suit en vain:

throw new Warning("text"); // Warning is not defined

Les erreurs font que les outils de développement de Chrome affichent une croix rouge, mais comment puis-je afficher une icône d'avertissement (point d'exclamation jaune)?

46
pimvdb

Comme ça:

console.warn('Hi!');

Notez que contrairement aux exceptions, cela n'interrompra pas votre code; la fonction d'appel continuera normalement.

Notez également que cela générera une erreur dans n'importe quel navigateur, à l'exception de WebKits ou Firefox avec Firebug, car console n'existera pas.

Pour résoudre ce problème, vous pouvez inclure Firebug Lite , ou créer un faux objet NOP-ing console.

72
SLaks

Utilisez console.warn(...);

Notez qu'il n'est défini que s'il y a une console - par exemple dans Firefox uniquement si FireBug est actif. Donc, si vous utilisez cela, n'oubliez pas de créer un objet console factice avec la méthode que vous utilisez si window.console n'est pas défini.

4
ThiefMaster

Pour être en sécurité, vous pouvez faire ceci:

(console ? (console.warn || console.log) : function (m) { return m; })
    ("warning text goes here")
;

Je fais quelque chose de similaire dans mes projets depuis console.log est plus largement pris en charge que console.warn .

Et si vous l'oubliez et l'envoyez en production ( qui n'est pas muy-bueno ), la fonction anonyme le mangera.

ÉDITER:

var notConsole = {
    log: function() {
        try {
            console.log.apply(this, arguments);
        } catch(e) {}
    },
    warn: function() {
        try {
            console.warn.apply(this, arguments);
        } catch(e) {}
    }
}

Fonctionne beaucoup mieux (merci @Solomon Ucko)

4
Campbeln

Il n'y a pas d'exception "d'avertissement". Lorsque vous lancez un objet (et vous pouvez lancer à peu près n'importe quoi), c'est une exception qui est interceptée ou non.

Vous pouvez éventuellement obtenir un effet d'avertissement en vous assurant que votre code intercepte les exceptions provenant de l'intérieur de votre code, en recherchant des objets "d'avertissement" d'une manière ou d'une autre (par type ou par typage de canard).

edit Cela a attiré des votes négatifs au fil des ans, donc je vais développer la réponse. L'OP a demandé explicitement "puis-je aussi lancer un avertissement?" La réponse pourrait être "oui" si vous aviez un constructeur "Warning":

function Warning(msg) {
  this.msg = msg;
}

Ensuite, vous pourriez certainement faire

if (somethingIsWrong())
  throw new Warning("Something is wrong!");

Bien sûr, cela fonctionnera, mais ce n'est pas très différent de

if (somethingIsWrong())
  throw "Something is wrong!";

Lorsque vous lancez des choses, elles peuvent être n'importe quoi, mais les choses utiles à lancer sont des instances d'erreur, car elles sont accompagnées d'une trace de pile. Dans tous les cas, il y aura soit une instruction catch, soit il n'y en aura pas, mais le navigateur lui-même ne se souciera pas que votre objet lancé soit une instance Warning.

Comme d'autres réponses l'ont souligné, si l'objectif réel affecte uniquement la sortie de la console, alors console.warn() est correct, mais bien sûr, c'est pas vraiment comparable à lancer quelque chose; c'est juste un message de log. L'exécution continue et si le code suivant ne peut pas gérer la situation qui a déclenché l'avertissement, il échouera toujours.

3
Pointy

Je ne pense pas que vous puissiez lancer un avertissement en JavaScript.

Aussi, il vaut mieux faire ...

throw {
   name: 'Error',
   message: 'Something error\'d'
}

Selon Crockford, de toute façon: P

3
alex

Juste au cas où quelqu'un chercherait encore ces années plus tard comme je l'étais maintenant, je voudrais souligner que la réponse (correcte) de Pointy est ce qui m'a amené à trouver la réponse à ma question: puis-je lancer un "avertissement" personnalisé objet?

Pointy a souligné que "vous pouvez lancer à peu près n'importe quoi", ce qui m'a amené à la documentation de throw:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

Extraits:

// Syntax
throw expression; // expression to throw

// Examples
throw 'Error2'; // generates an exception with a string value
throw 42;       // generates an exception with the value 42
throw true;     // generates an exception with the value true
throw new Error('Required');  // generates an error object with the message of Required

// Throw an object - you can specify an object when you throw an exception. You can then reference the object's properties in the catch block. The following example creates an object of type UserException and uses it in a throw statement.

// Example
function UserException(message) {
   this.message = message;
   this.name = 'UserException';
}
function getMonthName(mo) {
   mo = mo - 1; // Adjust month number for array index (1 = Jan, 12 = Dec)
   var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
      'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException('InvalidMonthNo');
   }
}

try {
   // statements to try
   var myMonth = 15; // 15 is out of bound to raise the exception
   var monthName = getMonthName(myMonth);
} catch (e) {
   monthName = 'unknown';
   console.log(e.message, e.name); // pass exception object to err handler
}

Tout le mérite revient à Pointy pour avoir donné la réponse (non acquittée) correcte, je ne fais que compléter avec des documents et des exemples

P.S. Désolé Pointy, je n'ai même pas assez de réputation pour te voter (13/15) :-(

1
caffeinatedbits