Throw() à l'intérieur de l'inclusion/fonction<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai un morceau de code qui est utilisé par de nombreux scripts, je l'ai donc transféré dans un fichier d'inclusion.Ce code effectue une vérification et lance s'il échoue.Cependant, je trouve qu'il ne tue que le script qui s'exécute à l'intérieur de l'inclusion, après quoi il récupère et commence à exécuter le code qui a initialement appelé l'inclusion.Ce genre de comportement, je vais appeler un soft kill.J'ai besoin du throw() qui est inclus pour tuer "les deux" scripts.
Les soft kills sont typiques dans d'autres langages mais s'exécutent à l'intérieur des fonctions, de cette façon vous pouvez faire échouer un morceau de code en silence.Cependant, il semble que throw() à l'intérieur d'une fonction tue réellement tous les scripts en cours d'exécution.
Exemple:
throwTest.jsl
Imprimer ( "UN" ) ;
Inclure ( "~chemin\throwTest.include.jsl" ) ;
Imprimer ( "D" ) ;
jeterTest = Fonction ({} , { Locale par défaut } ,
Imprimer ( "E" ) ;
lancer () ;
Imprimer ( "F" ) ;
) ;
jeterTest () ;
Imprimer ( "G" ) ;
throwTest.include.jsl
Imprimer ( "B" ) ;
lancer () ;
Imprimer ( "C" ) ;
Sortie du journal :
"A" "B" "D" "E"
Est-ce que quelqu'un sait comment tuer JSL à l'intérieur d'un script inclus?
Re : Throw() dans include/functionGénial merci Craige@JMP !J'attendrai avec impatience JMP 13 alors.
Re : Throw() dans include/functionJMP 13 (prévu pour septembre) résout ce problème ; le correctif vous demandera d'ajouter try(...) autour de l'include.(try n'attrape pas un lancer d'un include en 12.2).Sans l'essai, JMP 13 se comportera comme 12.2.
JMP 13 :
Imprimer("A");
essayer( Inclure("$desktop\throwTest.include.jsl"), imprimer("attraper")) ;
Imprimer("D");
lancerTest = Fonction({}, {Local par défaut},
Imprimer("E");
lancer();
Imprimer("F");
);
lancerTest();
Imprimer("G");
"A" "B" "attraper" "D" "E"
Re : Throw() dans include/functionJe vois les choses différemment.
Si tout ce que vous voulez faire est d'exécuter "beaucoup de choses", "de nombreux types de fonctions différents", rien ne vous empêche de mettre de nombreuses fonctions dans un seul script.Vous pouvez même effectuer des vérifications d'erreurs et arrêter l'exécution de fonctions sans lancer l'intégralité du script. --voir mon script Return() ci-dessous.
Le but des inclusions est de réduire le nombre de fois où vous devez coder exactement le même script.
Si j'ai 100 scripts différents, qui définissent tous a=1; b=2 ; c=3 ; ... ainsi de suite jusqu'à zz=702, vous ne voudriez pas taper tout cela 100 fois.Sans les inclusions, vous le saisiriez probablement une fois et le copieriez-coller dans vos autres scripts.Mais que se passe-t-il si vous trouvez un bogue en cours de route ?Vous devriez entrer dans 100 scripts et corriger manuellement le code.Un travail fastidieux.Mais que se passe-t-il si vous finissez par trouver un moyen plus rapide d'effectuer la même tâche de définition de toutes ces variables ?Vous auriez à refactoriser votre code 100 fois dans tous les scripts.Que se passe-t-il si vous décidez que vous voulez réellement a=2 ; b=3... etc.Vous auriez à changer votre code 100 fois.Changer 100 scripts est une tâche sujette aux erreurs, que se passe-t-il si vous manquez un script, faites une mauvaise modification, etc. ?
Le but d'inclus n'est pas de créer une relation esclave/maître où vous pouvez tuer l'esclave et sauver le maître.Nous avons des fonctions pour cela.Le but des inclusions est de gagner du temps lors du codage.
(Remarque : un autre objectif des inclusions est d'aider à séparer les langages de script, ce qui facilite le débogage et la propreté du code.Les inclusions sont particulièrement utiles dans les applications Web avec HTML/CSS/JavaScript, mais cela ne s'applique pas vraiment à JSL.)
Passer une variable de contrôle a quelques problèmes pas beaucoup mais quelques-uns.Que se passe-t-il si un autre script utilise la même variable de contrôle ?Que se passe-t-il si je décide de modifier la variable de contrôle ?Que se passe-t-il si j'ai mal saisi la variable de contrôle ? Dans chaque cas, je devrais alors aller chercher chaque script que j'ai inclus dans throwTest.include et modifier la variable check pour qu'elle soit correcte, ce qui va à l'encontre de l'objectif d'utiliser l'include en premier lieu.
Re : Throw() dans include/functionMise à jour, je ne sais pas pourquoi je n'y ai pas pensé la nuit dernière, mais l'envoi précoce de l'instruction return() lancera effectivement une fonction.Ceci est également courant dans d'autres langues.
jeterTest = Fonction ({} , { Locale par défaut } ,
Imprimer ( "E" ) ;
Retour () ;
Imprimer ( "F" ) ;
) ;
jeterTest () ;
Imprimer ( "G" ) ;
Sortir:
"PAR EXEMPLE"
Re : Throw() dans include/functionJe ne suis pas d'accord avec votre affirmation selon laquelle la méthode ci-dessus "va à l'encontre du but d'utiliser une inclusion".
Le code inclus peut exécuter de très nombreux types de fonctions différents et faire beaucoup de choses comme le nettoyage des données, les transformations, etc. Si dans le code inclus, un cas d'utilisation invalide est découvert, on peut vouloir fermer l'ensemble de l'application.Par conséquent, il faudrait lancer le code inclus, puis lorsque l'exécution est renvoyée au code principal, il faudrait détecter que la situation d'échec a été détectée, puis lancer le script principal.
Re : Throw() dans include/functionBien qu'il s'agisse d'un contournement simple, cela va vraiment à l'encontre du but de l'utilisation d'un include.
Re : Throw() dans include/functionJe pense que vous pouvez résoudre ce problème avec un simple passage d'informations via une variable de contrôle et prendre des mesures dans le script principal.
Noms par défaut ici ( 1 ) ;
Inclure ( "C:\Users\txjim\Documents\JMP\throwTest.include.jsl" ) ;
Si (jetez-le == 1 , Lancer () ) ;
Imprimer ( "D" ) ;
jeterTest = Fonction ( {} ,
{Local par défaut} ,
Imprimer ( "E" ) ;
Lancer () ;
Imprimer ( "F" ) ;
) ;
lancerTest() ;
Imprimer ( "G" ) ;
// Voici le fichier inclus
Imprimer ( "B" ) ;
jeter = 1 ;
Lancer () ;
Imprimer ( "C" ) ;