Throw() all'interno di include/funzione<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho un pezzo di codice utilizzato da molti script, quindi l'ho trasferito in un file di inclusione.Questo codice esegue un controllo e lancia se fallisce.Tuttavia, sto scoprendo che uccide solo lo script che è in esecuzione all'interno dell'inclusione, dopodiché riprende e avvia l'esecuzione del codice che originariamente chiamava l'inclusione.Questo tipo di comportamento lo chiamerò un soft kill.Ho bisogno del throw() incluso per uccidere "entrambi" gli script.
Le soft kill sono tipiche in altri linguaggi ma vengono eseguite all'interno di funzioni, in questo modo è possibile che un pezzo di codice fallisca silenziosamente.Tuttavia, sembra che throw() all'interno di una funzione uccida effettivamente tutti gli script in esecuzione.
Esempio:
throwTest.jsl
Stampa ( "UN" ) ;
Includere ( "~percorso\throwTest.include.jsl" ) ;
Stampa ( "D" ) ;
lancioTest = Funzione ({} , { Locale predefinito } ,
Stampa ( "E" ) ;
gettare () ;
Stampa ( "F" ) ;
) ;
lancioTest () ;
Stampa ( "G" ) ;
throwTest.include.jsl
Stampa ( "B" ) ;
gettare () ;
Stampa ( "C" ) ;
Uscita del registro:
"LA" "SI" "RE" "MI"
Qualcuno sa come uccidere JSL dall'interno di uno script incluso?
Re: Throw() all'interno di include/functionFantastico grazie Craige@JMP !Non vedo l'ora che arrivi JMP 13 allora.
Re: Throw() all'interno di include/functionJMP 13 (previsto per settembre) risolve questo problema; la correzione richiederà di aggiungere try(...) attorno all'inclusione.(try non prende un lancio da un'inclusione in 12.2).Senza try, JMP 13 si comporterà come 12.2.
MP 13:
Stampa("A");
Tentativo( Include("$desktop\throwTest.include.jsl"), print("cattura")) ;
Stampa("D");
throwTest = Function({}, {Locale predefinito},
Stampa("E");
gettare();
Stampa("F");
);
lancioTest();
Stampa("G");
"A" "B" "prendi" "D" "E"
Re: Throw() all'interno di include/functionVedo le cose in modo diverso.
Se tutto ciò che vuoi fare è eseguire "molte cose", "molti diversi tipi di funzioni" non c'è nulla che ti impedisca di inserire molte funzioni in uno script.Puoi persino eseguire controlli degli errori e interrompere l'esecuzione delle funzioni senza lanciare l'intero script. --vedi il mio script Return() di seguito.
Lo scopo degli include è ridurre il numero di volte in cui devi codificare lo stesso identico script.
Se ho 100 script diversi, ognuno dei quali definisce a=1; b=2; c=3; ... così via fino a zz=702, non vorrai scrivere tutto questo 100 volte.Senza include, molto probabilmente lo digiteresti una volta e lo copi e incolli negli altri script.Ma cosa succede se lungo la linea trovi un bug?Dovresti entrare in 100 script e correggere manualmente il codice.Un lavoro noioso.Ma cosa succede se finisci per trovare un modo più veloce per eseguire lo stesso compito di definire tutte queste variabili?Dovresti eseguire il refactoring del tuo codice 100 volte in tutti gli script.Cosa succede se decidi di volere davvero a=2; b=3... ecc.Dovresti cambiare il tuo codice 100 volte.La modifica di 100 script è un'attività soggetta a errori, cosa succede se perdi uno script, apporti una modifica sbagliata, ecc.?
Lo scopo di include non è quello di creare una relazione schiavo/padrone in cui puoi uccidere lo schiavo e salvare il padrone.Abbiamo funzioni per questo.Lo scopo di include è quello di salvare il tempo di codifica.
(Nota: un altro scopo degli include è aiutare a mantenere separati i linguaggi di scripting, semplificando il debug e mantenendo pulito il codice.Le inclusioni sono particolarmente utili nelle applicazioni Web con HTML/CSS/JavaScript, ma questo non si applica realmente a JSL.)
Il passaggio di una variabile di controllo presenta alcuni problemi, non molti ma alcuni.Cosa succede se un altro script utilizza la stessa variabile di controllo?Cosa succede se decido di cambiare la variabile di controllo?Cosa succede se ho digitato male la variabile di controllo? In ogni caso, dovrei quindi andare a cercare tutti gli script che ho incluso in throwTest.include e modificare la variabile di controllo in modo che sia corretta, il che vanifica lo scopo dell'utilizzo dell'inclusione in primo luogo.
Re: Throw() all'interno di include/functionAggiornamento, non sono sicuro del motivo per cui non ci ho pensato la scorsa notte, ma l'invio anticipato dell'istruzione return() genererà effettivamente una funzione.Questo è comune anche in altre lingue.
lancioTest = Funzione ({} , { Locale predefinito } ,
Stampa ( "E" ) ;
Ritorno () ;
Stampa ( "F" ) ;
) ;
lancioTest () ;
Stampa ( "G" ) ;
Produzione:
"PER ESEMPIO"
Re: Throw() all'interno di include/functionNon sono d'accordo con la tua affermazione secondo cui il metodo di cui sopra "sconfigge lo scopo di utilizzare un'inclusione".
Il codice incluso può eseguire molti, molti diversi tipi di funzioni e fare molte cose come la pulizia dei dati, le trasformazioni, ecc. Se all'interno del codice incluso viene scoperto un caso di utilizzo non valido, si potrebbe voler chiudere l'intera applicazione.Pertanto, è necessario lanciare il codice incluso, quindi quando l'esecuzione viene restituita al codice principale, è necessario rilevare che è stata rilevata la situazione di errore e quindi è necessario lanciare lo script principale.
Re: Throw() all'interno di include/functionSebbene si tratti di un semplice aggiramento, in realtà vanifica lo scopo dell'utilizzo di un'inclusione.
Re: Throw() all'interno di include/functionCredo che tu possa risolvere questo problema con un semplice passaggio di informazioni tramite una variabile di controllo e agire nello script principale.
I nomi predefiniti sono qui ( 1 ) ;
Includere ( "C:\Utenti\txjim\Documenti\JMP\throwTest.include.jsl" ) ;
Se ( buttarlo == 1 , Gettare () ) ;
Stampa ( "D" ) ;
lancioTest = Funzione ({} ,
{Locale predefinito} ,
Stampa ( "E" ) ;
Gettare () ;
Stampa ( "F" ) ;
) ;
lancioTest() ;
Stampa ( "G" ) ;
// Ecco il file di inclusione
Stampa ( "B" ) ;
buttarlo = 1 ;
Gettare () ;
Stampa ( "C" ) ;