Fehlermeldung – welche Zeile?JMP hilft dem Benutzer, Fehler im Code zu finden. Wird im Code ein nicht aufgelöster Name verwendet, stoppt JMP die Auswertung und zeigt eine Fehlermeldung an, die auf die fehlerhafte Codezeile verweist.
print(1);
result = x + zzz_missing;

Nehmen wir eine kleine Änderung am Code vor. Wenn JMP diesen Code ausführt…
myFunc = Function( {x},
{},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );
Es wird erneut eine Fehlermeldung zurückgegeben:

Es verweist jedoch auf Zeile 3 des Codes, in der x definiert ist. Das ist sehr überraschend: Der Fehler tritt in Zeile 4 auf: Der Benutzer hat ein `Name expr()` zum Schutz des Ergebnisses vergessen – und JMP wertet den Ausdruck versehentlich aus!
Da wir dieses Verhalten bereits in einem anderen Beitrag besprochen haben ( Fehlerverfolgung: JMP versucht zu "helfen" ), kommen wir nun direkt zur nächsten Überraschung.
Noch überraschender ist in der Tat die Fehlermeldung für diesen Code:
myFunc = Function( {x},
{Default Local},
result = x + zzz_missing;
Return( result );
);
myFunc( 3 );

-> Keine Informationen zur Linie!?! - Nicht einmal eine falsche.
Warum?
Automatisierung und SkripterstellungBetreff: Fehlermeldung – welche Zeile?Gleiche Einschränkung bei Try(): keine Informationen über die Codezeile.
Try(
result = zzz_missing;
Print( 1 );
,
Print( exception_msg )
);

Betreff: Fehlermeldung – welche Zeile?Gibt es einen Befehl?
- wie log Capture() oder Versuchen() - die nicht stoppen, wenn im eingeschlossenen Ausdruck ein Fehler auftritt.
- welche Codezeile den Fehler verursacht?
Betreff: Fehlermeldung – welche Zeile?Protokollerfassung
Laut Skriptindex erfasst es die Ausgabe im Protokoll und gibt sie als Zeichenkette zurück.

Aber es kann noch mehr!
Es verhält sich wie versuchen() und ermöglicht es, die Ausführung des Codes nach einem schwerwiegenden Fehler innerhalb des ausgewerteten Ausdrucks fortzusetzen.
log=Log capture(
result = zzz_missing;
print(1)
);
Print(2);
Show(log)
print(1) wird übersprungen - print(2) wird ausgeführt.

Fast perfekt. Leider (!) wird die Codezeile, in der der Fehler auftritt, nicht ausgegeben!
Betreff: Fehlermeldung – welche Zeile?Ah: Fehlertypen von Vince Faller

@Ryan_Gilmore , könntest du bitte den Wunsch zur Stimmabgabe wieder aktivieren?
@Ben_BarrIngh , @russ_wolfinger , nur zur Info.
Betreff: Fehlermeldung – welche Zeile?Vielleicht könnte man diese Anfrage mit dieser hier kombinieren:
Verbesserter JSL-Stacktrace im Fehlerprotokoll
Betreff: Fehlermeldung – welche Zeile?Übrigens – weiß jemand, was in der Fehlermeldung zurückgegeben wird?

1?
2?
Betreff: Fehlermeldung – welche Zeile?Kann ein JSL-Code eine „untergeordnete“ Ausführung auslösen, die möglicherweise mit einer Fehlermeldung über die fehlerhafte Zeile abbricht?
Und der Hauptcode bleibt erhalten und wird weiterhin ausgeführt, entweder wenn die Ausführung des Kindprozesses beendet ist oder wenn die Ausführung des Kindprozesses abgebrochen wird?
Betreff: Fehlermeldung – welche Zeile?// 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);

Setzt trivialen Code mit maximal einer Antwort pro Codeblock voraus.
Lässt sich problemlos auf komplexere Codes erweitern.