133 votes

L'équivalent JavaScript du die de PHP

Existe-t-il quelque chose comme "die" en JavaScript ? J'ai essayé avec "break", mais ça ne marche pas :)

2 votes

3 votes

function die(str) {throw new Error(str || "Script ended by death");} Ou quelque chose comme ça XD Il y a plein de meilleures options, mais ça pourrait marcher. Cela pourrait être bon pour le débogage, si vous voulez seulement exécuter la première partie d'un script pour vous assurer qu'il fonctionne.

0 votes

@stefita Pourquoi votre commentaire ne figure-t-il pas dans les réponses ? exit() était exactement ce dont j'avais besoin. L'autre moyen, c'est d'exécuter une boucle d'appel automatique, qui sera exécutée 1599 fois puis arrêtera l'exécution. Merci.

241voto

spudly Points 2108
throw new Error("my error message");

8 votes

C'est absolument la solution et cela fonctionne exactement comme die() ; cependant, il ne faut pas se soucier du "1 Error" rouge de firebug !

3 votes

Je pense que si PHP a un équivalent "firebug", il devrait aussi écrire "1 error" sur die() ;-) Bonne réponse !

1 votes

Cela ne va-t-il pas produire une boîte de dialogue d'avertissement dans IE8 ?

37voto

Eli Grey Points 17553

Vous pouvez seulement break une portée de bloc si vous l'étiquetez. Par exemple :

myBlock: {
  var a = 0;
  break myBlock;
  a = 1; // this is never run
};
a === 0;

Vous ne pouvez pas rompre l'étendue d'un bloc à partir d'une fonction de l'étendue. Cela signifie que vous ne pouvez pas faire des choses comme :

foo: { // this doesn't work
  (function() {
    break foo;
  }());
}

Vous pouvez cependant faire quelque chose de similaire avec des fonctions :

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}

6 votes

Je ne savais pas qu'il fallait étiqueter un bloc et encore moins en écrire un. Cela signifie-t-il que foo: {} est un objet ?

4 votes

Non. C'est une lunette de visée. C'est la même chose que foo: if(true){...}

0 votes

Existe-t-il une alternative puisque vous ne pouvez pas "casser un bloc de l'étendue à partir d'une fonction dans l'étendue" ?

24voto

themis Points 2243

Vous pouvez simplement utiliser le return; exemple

$(document).ready(function () {
        alert(1);
        return;
        alert(2);
        alert(3);
        alert(4);
});

Le retour renverra à la fonction appelante principale test1() ; et continuera de là jusqu'à test3() ;

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    return;
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

mais si vous ajoutez simplement throw '' ; cela arrêtera complètement l'exécution sans causer d'erreurs.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    throw '';   
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

Ceci est testé avec firefox et chrome. Je ne sais pas comment cela est géré par IE ou Safari.

2 votes

Pour autant que je sache, return ne quitte que la fonction englobante. Cela ne fonctionne pas lorsque vous voulez arrêter l'exécution de l'ensemble du script.

1 votes

Hmmm oui vous avez raison, cela n'arrête pas l'exécution de tous les script.

0 votes

throw "" : ...sans provoquer d'erreurs... - Pas tout à fait... Uncaught ""

18voto

Brilliand Points 4167

Appelez simplement die() sans jamais la définir. Votre script se plantera :)

Quand je fais cela, j'appelle généralement discombobulate() à la place, mais le principe est le même.

(En fait, ce que cela fait, c'est lancer un ReferenceError ce qui revient à peu près au même que la réponse de Spudly - mais c'est plus court à taper, pour des raisons de débogage).

0 votes

L'utilisation d'un identifiant personnalisé indéfini est très créative ! J'aime comment die est intuitif et concis. Il lui manque l'avantage de throw lorsqu'il s'agit de consigner un message d'erreur spécifique, mais parfois le numéro de ligne suffit. BTW, die; sans les parenthèses (dé)fonctionne aussi.

0 votes

Ou simplement die ; à la ligne où vous voulez que votre javascript s'arrête.

0 votes

Cette réponse est tellement orientée JS^^ Ce n'est pas sale si ça marche !

7voto

Kelmar Points 21

Il est possible de créer votre propre version du dé de PHP :

function die(msg)
{
    throw msg;
}

function test(arg1)
{
    arg1 = arg1 || die("arg1 is missing"); 
}

test();

Exemple de JSFiddle

0 votes

Je voulais mentionner que cela ne fonctionnera pas dans des cas tels que var a = arguments[3] || die('message') . au lieu de cela, je pense que la mort devrait être : function die(msg) { return eval(`throw "${msg}"`);) mais même dans ce cas, je pense qu'il faudrait simplement le placer en dur sur la ligne qui casse, de sorte que l'erreur montre quelle ligne a échoué, par exemple this.inputFile = argv[2] || eval('throw "this program requires an input file."');

0 votes

Probablement, pas sûr que eval() résout le problème si je vous comprends bien. Idéalement, il faudrait regarder une trace de la pile si vous êtes intéressé par l'endroit où l'échec se produit réellement. Sinon, je pense qu'il est prudent de supposer que vous voulez simplement rapporter une sorte de message d'échec de base à votre utilisateur.

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