Message d'erreur - quelle ligne ?JMP aide l'utilisateur à trouver les erreurs dans le code. Si un nom non résolu est utilisé, JMP interrompt l'évaluation et affiche un message d'erreur indiquant la ligne de code erronée.
print(1);
result = x + zzz_missing;

Apportons une légère modification au code. Lorsque JMP exécute ce code
myFunc = Function( {x},
{},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );
Il renvoie à nouveau un message d'erreur :

Mais le message d'erreur pointe vers la ligne 3 du code où x est défini. C'est très surprenant : l'erreur se produit à la ligne 4 : l'utilisateur a omis d'ajouter un nom à l'expression `expr()` pour protéger le résultat , et JMP évalue accidentellement cette expression !
Comme nous avons déjà évoqué ce comportement dans un autre article ( Traçage des erreurs : JMP tente de « aider » ), nous allons passer directement à la prochaine surprise.
Plus surprenant encore est le message d'erreur associé à ce code :
myFunc = Function( {x},
{Default Local},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );

-> Aucune information concernant cette ligne !?! - même pas une ligne erronée.
pourquoi ?
Automatisation et scriptageRe: Message d'erreur - quelle ligne ?Même restriction avec Try() : aucune information sur la ligne de code
Try(
result = zzz_missing;
Print( 1 );
,
Print( exception_msg )
);

Re: Message d'erreur - quelle ligne ?Existe-t-il une commande
— comme journal Capture() ou Essayer() — qui ne s'arrête pas lorsqu'une erreur se produit dans l'expression incluse
- laquelle renvoie la ligne de code qui produit l'erreur ?
Re: Message d'erreur - quelle ligne ?Capture de journal
Selon l'index des scripts, il capture la sortie dans le journal et la renvoie sous forme de chaîne de caractères.

mais il fait bien plus que cela !
Il agit comme essayer() et permet à l'exécution du code de se poursuivre après une erreur fatale dans l'expression évaluée.
log=Log capture(
result = zzz_missing;
print(1)
);
Print(2);
Show(log)
imprimer(1) est ignoré - imprimer(2) est exécuté.

Presque parfait. Malheureusement (!) il oublie d'indiquer la ligne de code où l'erreur se produit !
Re: Message d'erreur - quelle ligne ?Ah : Types d'erreurs par Vince Faller

@Ryan_Gilmore , pourriez-vous réactiver l'option de vote ?
@Ben_BarrIngh , @russ_wolfinger , pour info.
Re: Message d'erreur - quelle ligne ?Peut-être combiner cette demande avec celle-ci :
Amélioration de la trace de pile JSL dans la journalisation des erreurs
Re: Message d'erreur - quelle ligne ?Au fait, quelqu'un sait-il ce qui est renvoyé dans le message d'exception ?

1 ?
2 ?
Re: Message d'erreur - quelle ligne ?Un code JSL peut-il déclencher l'exécution d'un processus « enfant » qui pourrait s'interrompre avec un message d'erreur concernant la ligne d'erreur ?
Et le code principal survit et continue d'être exécuté, soit lorsque l'exécution du processus enfant est terminée, soit lorsque l'exécution du processus enfant est interrompue ?
Re: Message d'erreur - quelle ligne ?// 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);

Suppose un code trivial avec <=1 réponse par bloc de code.
Peut être facilement étendu pour fonctionner avec un code plus complexe.