Messaggio di errore: quale riga?JMP aiuta l'utente a trovare errori nel codice. Se nel codice viene utilizzato un nome non risolto, JMP interrompe la valutazione e mostra un messaggio di errore, che indica la riga di codice errata.
print(1);
result = x + zzz_missing;

Apportiamo una piccola modifica al codice. Quando JMP esegue questo codice
myFunc = Function( {x},
{},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );
restituisce nuovamente un messaggio di errore:

Ma punta alla riga 3 del codice, dove è definito x. Questo è davvero sorprendente: l'errore "accade" alla riga 4: l'utente ha omesso un Nome expr() per proteggere il risultato e JMP valuta accidentalmente l'espressione!
Poiché abbiamo già discusso di questo comportamento in un altro post ( Tracciamento degli errori: JMP cerca di "aiutare" ), passeremo direttamente alla prossima sorpresa.
In effetti, ancora più sorprendente è il messaggio di errore per questo codice:
myFunc = Function( {x},
{Default Local},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );

-> nessuna informazione sulla linea!?! - nemmeno una sbagliata.
Perché?
Automazione e scriptingRe: Messaggio di errore - quale riga?Stessa restrizione con Try(): nessuna informazione sulla riga di codice
Try(
result = zzz_missing;
Print( 1 );
,
Print( exception_msg )
);

Re: Messaggio di errore - quale riga?C'è un comando?
- come cattura registro() o Tentativo() - che non si ferma quando c'è un errore nell'espressione racchiusa
- che restituisce la riga di codice che produce l'errore?
Re: Messaggio di errore - quale riga?Acquisizione del registro
in base all'indice di scripting, cattura l'output nel registro e lo restituisce come stringa.

ma fa molto di più!
Funziona come Tentativo() e consente di continuare l'esecuzione del codice dopo un errore fatale all'interno dell'espressione valutata.
log=Log capture(
result = zzz_missing;
print(1)
);
Print(2);
Show(log)
stampa(1) viene saltato - stampa(2) viene eseguito.

quasi perfetto. Purtroppo (!) dimentica di scrivere la riga di codice in cui si verifica l'errore!
Re: Messaggio di errore - quale riga?Ah: Tipi di errore di Vince Faller

@Ryan_Gilmore , potresti riattivare il desiderio di votare?
@Ben_BarrIngh , @russ_wolfinger , per vostra informazione.
Re: Messaggio di errore - quale riga?forse potresti combinare la richiesta con questa:
Miglioramento dello stack JSL nel registro degli errori
Re: Messaggio di errore - quale riga?A proposito, qualcuno sa cosa viene restituito nel messaggio di eccezione?

1?
2?
Re: Messaggio di errore - quale riga?Un codice JSL può innescare un'esecuzione "figlia", che potrebbe interrompersi con un messaggio di errore relativo alla riga di errore?
E il codice principale sopravvive e viene eseguito ulteriormente, sia quando l'esecuzione figlio è terminata, sia quando l'esecuzione figlio è terminata?
Re: Messaggio di errore - quale riga?// demo command
MyExpr = Expr(
Print( 1 );
z = 5;
x = xyz;
Print( 2 );
);
stopnow = 0; // if there is an error, don't execute subsequent blocks of code
summary = "";
// execute blocks of code and collect replies and error messages
For Each( {part, line}, Name Expr( myExpr ),
Try(
Eval( Name Expr( part ) );
new = "";
,
new = "part " || Char( line ) || ": " || Char( Name Expr( part ) ) || "\!n" || Char( exception_msg );
stopNow = 1;
);
Wait( 0 );
summary = summary || new || (tmp = Char( Get Log( -1 )[1] ) ; If( tmp == "/*:", "", "\!N" || tmp || "\!N" ));
Clear Log();
If( stopnow, break() );
);
Show(summary);

Presuppone un codice banale con <=1 risposta per blocco di codice.
Può essere facilmente esteso per funzionare con codice più complesso.