Ich bin auf folgendes Problem gestoßen (Minimalbeispiel unten). Handelt es sich um einen Fehler oder übersehe ich etwas?
(Windows 11, JMP 18.0)
Das folgende Skript lässt JMP abstürzen, anstatt einfach nur eine Fehlermeldung auszugeben:
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
Im Gegensatz zum oben Genannten wird ohne das Traceback-Flag normalerweise der Fehler "thrown" ausgelöst.
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown" ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
Außerdem wird der Absturz verhindert, indem die Return()-Anweisung in die Try()-Anweisung eingebunden wird.
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Try( Return( sub_f() ), Throw( "crash prevented" ) )
);
f()
Sie haben einen Fehler in JMP gefunden. Ich reiche einen Bericht ein, der auf diesen Thread verweist. Sie können das Problem umgehen, indem Sie die lokale Variable für sub_f auskommentieren.
f = Function( {}, // { sub_f },
(Ich bin mir ziemlich sicher, dass diese Erklärung einigermaßen korrekt ist...) Bis JMP die Ausnahme `throw()` abfängt, sind die lokalen Variablen bereits zerstört und die Informationen für den Traceback verloren. Der Code, der den Traceback erzeugt, ist darauf nicht vorbereitet und stürzt mit einem ungültigen Speicherzugriff ab. Wenn Sie `try()` innerhalb der Funktion hinzufügen, fängt JMP die Ausnahme innerhalb der Funktion ab, und die lokale Variable ist noch nicht zerstört. Alternativ können Sie die Funktion auch einfach global deklarieren.
Bearbeitet: TS-00250890