JavaScript équivalent du die de PHP


100

Y a-t-il quelque chose comme "mourir" en JavaScript? J'ai essayé avec "break", mais ne fonctionne pas :)



"die", comme "goto" ne sont pas compatibles avec la programmation structurée. Ces types d'instructions ne doivent jamais être utilisés pour un projet sérieux. en.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}Ou quelque chose XD Beaucoup de meilleures options là-bas, mais cela fonctionnerait. Cela peut être bon pour le débogage, si vous souhaitez uniquement exécuter la première partie d'un script pour vous assurer qu'il fonctionne.
Niet the Dark Absol

@stefita Pourquoi votre commentaire n'est-il pas dans les réponses ?? exit () était exactement ce dont j'avais besoin. L'autre façon, est d'exécuter une boucle d'appel automatique, s'exécutera 1599 fois puis arrêtera l'exécution. THX.
m3nda

@AdrianMaire Votre cœur est au bon endroit, mais le "pourquoi" d'une question ne devrait pas être en cause. Les maux de die, goto, eval, etc. sont sans cesse régurgité (et non sans fondement), mais ils ont tous leurs usages spéciaux, en particulier pour le débogage de bas niveau. Sinon, les langues ne les incluraient pas. Dans ce cas, les équivalents JS de returnet throwsont suffisamment inoffensifs.
Beejor

Réponses:


34

Vous ne pouvez breakbloquer l'étendue que si vous l'étiquetez. Par exemple:

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

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

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

Vous pouvez faire quelque chose de similaire avec les fonctions:

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

5
Je n'ai jamais su étiqueter une étendue de bloc et encore moins écrire une étendue de bloc. Cela signifie-t-il que foo: {}c'est un objet?
enchance le

3
Non, c'est une portée de bloc. C'est la même chose quefoo: if(true){...}
Eli Gray

Existe-t-il une alternative puisque vous ne pouvez pas "casser une portée de bloc à partir d'une fonction dans la portée"?
haykam

207
throw new Error("my error message");

7
c'est absolument la réponse et fonctionne exactement comme die (); cependant, il ne faut pas se soucier de la "Erreur 1" rouge de Firebug!
Alexar

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

1
Cela ne produira-t-il pas une boîte de dialogue d'avertissement dans IE8?
sbichenko

Pas un équivalent 1-to-1, puisque PHP n'a pas non plus d'exceptions.
Brilliand

Cela n'arrêtera pas totalement l'exécution AFAIK, mais seulement à peu près autour du lancer. Les détails sont très flous mais je suis à peu près sûr que le script peut continuer à s'exécuter ailleurs.
Rolf

22

Vous pouvez simplement utiliser l' return;exemple

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

Le retour retournera à la fonction principale de l'appelant test1 (); et continuez à partir 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
Autant que je sache, returnquitte uniquement la fonction englobante. Cela ne fonctionne pas lorsque vous souhaitez arrêter d'exécuter tout le script.
André Leria

1
hmmm oui tu as raison, ça n'arrête pas l'exécution de tout le script.
themhz

throw "": ... sans causer d'erreur ... - Pas tout à fait ...Uncaught ""
FZs

15

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

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

(En fait, ce que cela fait, c'est lancer un ReferenceError, ce qui en fait à peu près la même chose que la réponse spudly - mais il est plus court à taper, à des fins de débogage.)


L'utilisation d'un identifiant personnalisé non défini est très créative! J'aime la façon dont diec'est intuitif et concis. Il n'a pas l'avantage de throwconsigner un message d'erreur spécifique, mais parfois, seul le numéro de ligne suffit. BTW, die;sans les parenthèses (un-) fonctionne aussi.
Beejor

ou tout simplement mourir; à la ligne où vous voulez que votre javascript s'arrête.
MarcoZen

Cette réponse est tellement pensée pour JS ^^ Ce n'est pas sale si ça marche!
Yonn Trimoreau

7

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

function die(msg)
{
    throw msg;
}

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

test();

Exemple JSFiddle


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

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

7

Si vous utilisez nodejs, vous pouvez utiliser

process.exit(<code>);

4
S'il s'agissait de node.js, la question aurait la balise node.js
FelixSFD

3
@FelixSFD: Cela m'a quand même aidé, car je cherchais exactement cela, en ignorant complètement les balises;)
DE

3

utilisez Firebug et le glorieux ...

debugger;

et ne laissez jamais le débogueur faire un pas en avant. Plus propre que de jeter un bon Error, innit?


2
Pas exactement la même chose!
Rolf

2

Il n'y a pas d'égalité exacte de la construction diede langage de PHP en Javascript . dieen PHP est à peu près égale à System.exit()en Java , qui se termine le script en cours et appelle des crochets d'arrêt. Comme certains utilisateurs l'ont suggéré; throw Errorpeut être utilisé dans certains cas, mais il ne garantit jamais la fin du script en cours. Il peut toujours y avoir un bloc de gestion des exceptions entourant votre throwinstruction - à moins que vous ne l'appeliez sur le bloc de script le plus élevé, qui finit par ne quitter que le bloc de script que vous exécutez.

Cependant, cela n'empêchera pas le deuxième bloc d'être exécuté ici (affiche bonjour):

<script type="text/javascript">
  throw new Error('test');
</script>
<script type="text/javascript">
  document.write("hello");
</script> 


1

Il n'y a pas d'exit de fonction équivalent à php die () dans JS, si vous n'utilisez aucune fonction, vous pouvez simplement utiliser return;

return;

0

Vous pouvez utiliser return false; Cela mettra fin à votre script.


3
Seulement au plus haut niveau, probablement. Die () de PHP peut être appelé à n'importe quel niveau et fera disparaître l'interpréteur PHP directement.
Rolf

0

Cela devrait fonctionner comme die ();

function die(msg = ''){
    if(msg){
        document.getElementsByTagName('html')[0].innerHTML = msg;
    }else{
        document.open();
        document.write(msg);
        document.close();
    }
    throw msg;
}

0

Fonction die () globale à des fins de développement:

var die = function(msg) {
    throw new Error(msg);
}

Utilisez die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.