Wie man Mathematica sagt, dass es bei einem Debug-Fehler beendet werden soll

8

Gibt es in Mathematica eine Einstellung (würde ich erwarten, dass es sich um eine Umgebungsvariable handelt), die den Kernel beim Auftreten eines Debug-Fehlers beendet? Oft bekomme ich Debug-Fehler und das Notebook wird weiterhin schlechte Daten auswerten und mich zwingen, den Kernel neu zu starten.

    
rjkaplan 02.11.2011, 20:52
quelle

4 Antworten

4

Sie haben geschrieben:

  

In erster Linie möchte ich, dass mein Notebook nicht mehr auf Assertion läuft   Fehler.

Sie können dies tun, indem Sie $AssertFunction wie folgt definieren:

%Vor%

Nun wird der Kernel beendet, wenn eine Assertion fehlschlägt:

%Vor%

Alternativ können Sie Interrupt auf die gleiche Weise verwenden:

%Vor%

Damit können Sie die Auswertung abbrechen oder subsession eingeben (das gleiche wie Dialog[] in Arnouds Antwort).

Sie können diesen Ansatz auch zum Drucken der fehlgeschlagenen Assertion erweitern:

%Vor%     
Alexey Popkov 10.11.2011, 04:15
quelle
13

Nach einer Idee aus dem Mathematica Toolbag :

%Vor%

Ersetzen Sie hier myMessage::debug durch den eigentlichen Nachrichtentyp, den Sie abfangen möchten.

Normale Nachricht:

%Vor%

Ihre 'Debug' Nachricht:

%Vor%

Aktualisieren

Assert Nachrichten erhalten einige zusätzliche Argumente, so dass Sie diese auch fangen müssen. Und übrigens müssen Sie den tatsächlichen Nachrichtennamen in die Definition einfügen (nicht mit der Beispielnachricht, die ich oben verwendet habe):

%Vor%     
Sjoerd C. de Vries 02.11.2011 21:21
quelle
8

Diese Antwort geht davon aus, dass mit "Debug-Fehler" gemeint ist, dass eine Nachricht ausgegeben wurde. Zum Beispiel wird eine Nachricht als Warnung ausgegeben, wenn man versucht, durch Null zu teilen:

%Vor%

Beachten Sie, wie ComplexInfinity von der Anweisung Print gedruckt wurde, obwohl die Warnmeldung ausgegeben wurde, die zeigt, dass die Berechnung nach dem "Fehler" fortgesetzt wird.

Ich werde die ausgezeichnete Antwort von @ Sjoerd nicht wiederholen, die zeigt, wie eine Mathematica-Sitzung konfiguriert wird, so dass der Kernel beendet wird, wenn eine Nachricht von einer Evaluierung ausgegeben wird. Wenn Sie selektiver sein und den Kernel nur beenden möchten, wenn eine bestimmte Auswertung eine Nachricht ausgibt, dann könnte die folgende Funktion nützlich sein:

%Vor%

Mit dieser Definition können Sie den Kernel zum Beenden zwingen, nachdem eine Nachricht von einer bestimmten Auswertung ausgegeben wurde:

%Vor%

Wenn es sinnvoll ist, den Kernel nur zu beenden, wenn bestimmte Nachrichten ausgegeben werden. Zu diesem Zweck akzeptiert checkQuit ein optionales zweites Argument, mit dem die relevanten Nachrichten spezifiziert werden können:

%Vor%

Beachten Sie, dass der Kernel nicht beendet wurde, da die Nachricht nicht mit Power::infy übereinstimmte. Aber beachte:

%Vor%

Hier wird der Kernel beendet, weil die angezeigte Nachricht erscheint. Es ist möglich, mehrere Nachrichten oder sogar vordefinierte Nachrichtengruppen zu filtern. Weitere Informationen finden Sie unter .

    
WReach 03.11.2011 01:52
quelle
7

Zusätzlich zu den anderen Antworten möchten Sie möglicherweise Folgendes untersuchen:

%Vor%

Damit können Sie Code ausführen, wenn eine Nachricht ausgelöst wird.

Sie können dies beispielsweise auswerten:

%Vor%

Dies gibt den Auswertungsstapel (manchmal sehr groß!) des zu bewertenden Codes aus. Die Dialogfunktion versetzt Sie in eine Unterauswertungsschleife, in der Sie die Werte überprüfen können von Variablen. Um die Dialogschleife zu verlassen, können Sie Folgendes auswerten:

%Vor%

bringt Sie zurück zur Hauptschleife (die Hauptbewertung beendet oder bricht dann ab) bei einer neuen Nachricht).

    
Arnoud Buzing 03.11.2011 21:41
quelle