Ho riscontrato il seguente problema (esempio minimo qui sotto). Si tratta di un bug o mi sfugge qualcosa?
(Windows 11, JMP 18.0)
Lo script seguente blocca JMP anziché generare semplicemente l'errore:
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
Contrariamente a quanto sopra, senza il flag traceback, normalmente viene generato l'errore "thrown".
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown" ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
Inoltre, l'arresto anomalo viene impedito intrappolando Return() in Try().
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()
Hai trovato un bug in JMP, ti invio una segnalazione che rimanda a questa discussione. Puoi aggirarlo commentando la variabile locale per sub_f:
f = Function( {}, // { sub_f },
(Sono abbastanza sicuro che questa sia una spiegazione ragionevolmente corretta...) Quando JMP intercetta throw(), le variabili locali vengono distrutte e le informazioni per il traceback sono andate perse. Il codice che genera il traceback non è preparato a questo e si blocca con un riferimento di memoria non valido. Quando si aggiunge try() all'interno della funzione, JMP intercetta throw all'interno della funzione e la variabile locale non è stata distrutta. In alternativa, è possibile mantenere la funzione in una variabile globale.
modifica: TS-00250890