53 votes

Gestion des erreurs JavaScript : puis-je lancer une erreur à l'intérieur d'un opérateur ternaire ?

Suis-je autorisé à lancer une erreur à l'intérieur d'un opérateur ternaire ? Est-ce valide :

function foo(params) {

    var msg = (params.msg) ? params.msg : (throw "error");

    // do stuff if everything inside `params` is defined
}

Ce que j'essaie de faire est de m'assurer que tous les paramètres nécessaires, qui sont dans un objet param, sont définis et de lancer une erreur si l'un d'eux n'est pas défini.

Si c'est juste stupide, y a-t-il une meilleure approche pour le faire ?

72voto

Dagg Nabbit Points 23918

Vous pouvez faire ceci :

function foo(params) {

    var msg = (params.msg) ? params.msg : (function(){throw "error"}());

    // do stuff if everything inside `params` is defined
}

Je ne le recommanderais pas vraiment cependant, cela rend le code illisible.

Cela fonctionnerait également (pas que ce soit vraiment beaucoup mieux) :

function foo(params) {

    var msg = params.msg || (function(){throw "error"}());

    // do stuff if everything inside `params` is defined
}

Ou pour une approche plus propre, créez une fonction nommée.

function _throw(m) { throw m; }
function foo(params) {

    var msg = params.msg || _throw("error");

    // do stuff if everything inside `params` is defined
}

23voto

minitech Points 87225

Non, ce n'est absolument pas autorisé. throw est un énoncé et il ne peut pas faire partie d'une expression.

Malheureusement, je pense que c'est le seul moyen. Vous pouvez utiliser ifs sans les accolades :

if(!params.msg) throw new Error("msg is required!");

Mais il n'y a pas de solutions de contournement faciles et agréables que je connaisse.

3voto

bildungsroman Points 51

C'est une façon plus propre qui a fonctionné pour moi :

const msg = params.msg ? params.msg : ((function () { throw new Error('Message not found); }()));

2voto

Saurabh Points 1871

Vous pouvez lancer une erreur comme celle-ci à l'intérieur d'un opérateur ternaire,

function isPositive(a) {
    if(a > 0)
        return "YES";
    throw a == 0 ? Error("Zero Error") : Error("Negative Error");
}

1voto

James Wakefield Points 49

Voici un petit truc simple qui sera jeté d'un ternaire. J'appelle simplement une propriété inexistante, impossible à jamais, sur le symbole indéfini. Je n'ai vérifié que le chrome, et il peut être attrapé et relancé comme indiqué si vous en avez besoin pour avoir un message d'erreur approprié, mais ce n'est pas nécessaire bloat

try {
  var msg = (params.msg) ? params.msg : (void 0).throwError()
}
catch(e) {
  throw new Error('Params has no msg property')
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X