Y a-t-il un cadre (je m'attendrais à ce qu'elle soit une variable d'environnement) dans Mathematica qui ferait cesser le noyau à la survenue d'une erreur de débogage? Souvent, je vais obtenir des erreurs de débogage et le cahier continuera à évaluer les mauvaises données me forçant à redémarrer le noyau. P>
4 Réponses :
Après une idée empruntée à partir du Boîte à outils Mathematica A >:: Unprotect[Message];
Message[mm : Assert::asrtfl, m___] :=
Block[{$inMsg = True, result},
Message[mm, m];
Quit[]] /; ! TrueQ[$inMsg]
Protect[Message];
Merci pour votre réponse! J'ai un problème déroutant, cependant: quand je fixe myMessage :: débogu = "assert :: asrtfl" et envoyer un message ["assert :: asrtfl:"], l'échec de l'affirmation est capturé et le noyau quitte. Mais quand une affirmation réelle se produit, il n'est pas attrapé. Suis-je tort que le message d'une affirmation échoue est "Astert :: asrtfl"?
Merci encore pour la réponse, mais copier et coller le code que vous donnez dans la mise à jour ne attrape toujours pas d'assertus pour une raison quelconque. Puis-je confirmer avec vous que vous avez testé?
@RJKAPLAN Oui, j'ai fait. J'ai utilisé le code exemple sur la page ASSTER DOC. << ExampleData`funccunccunctionwithassert` sur [ASSERT]; Calculer [1.0] code>
Cette réponse suppose que par "Erreur de débogage", vous voulez dire qu'un message a été publié. Par exemple, un message est émis comme un avertissement si on tente de diviser par zéro: notez comment Je ne vais pas ré-itérer une excellente réponse de Sjoerd qui montre comment configurer une session Mathematica afin que le noyau sortira si un message est émis par une évaluation. Si vous souhaitez être plus sélectif et seulement quitter le noyau si une évaluation particulière émet un message, la fonction suivante peut être utile: p> avec cette définition en place, vous Peut forcer le noyau à arrêter de fumer après que n'importe quel message soit émis par une évaluation particulière: p> si peut être pratique pour ne pas quitter le noyau si certains messages sont émis. À cette fin, Notez comment le noyau n'a pas été excité Puisque le message ne correspond pas à complexinfinity code> a été imprimé par le
Imprimer code > Déclaration Même si le message d'avertissement a été émis, montrant que le calcul persiste après l'erreur "Erreur". P>
checkquit code> accepte un deuxième argument facultatif pouvant être utilisé pour spécifier les messages d'intérêt: p>
Power :: infy code>. Mais envisagez: P>
In[7]:= checkQuit[1/0, Power::infy]
Power::infy: Infinite expression 1/0 encountered. >>
checkQuit::quit: The kernel is being shut down!
En plus des autres réponses, vous voudrez peut-être enquêter à l'aide de: qui vous permet d'exécuter du code lorsque n'importe quel message est déclenché. P> Par exemple, vous Peut évaluer ceci: p> qui imprime la pile d'évaluation (parfois très grande!) du code qui évalue. La fonction de dialogue vous met ensuite dans une boucle de sous-évaluation, vous permettant d'inspecter les valeurs.
des variables. Pour sortir de la boucle de dialogue, vous pouvez évaluer: p> qui vous ramène à la boucle principale (l'évaluation principale puis se termine ou casse
dans un nouveau message). p> p>
Salut Arnoud! Nice te voir ici. Belle réponse aussi +1
@ Sjoerdc.devries: Je pensais que je lui donnerais un tourbillon. Je commence à comprendre pourquoi les gens sont accro à Stackoverflow ...
Vous voudrez peut-être regarder Stackoverflow.com/tags/mathematica/topusers . Vous êtes déjà dans ce mois 'Top-10
Vous avez écrit:
Principalement, j'aimerais que mon cahier arrête de courir sur une affirmation erreur. p> blockQuote>
Vous pouvez le faire en définissant
$ Assserfunction code>
comme suit: p>xxx pré> Le noyau arrête maintenant quand une affirmation échoue: p>
xxx pré> alternativement, Vous pouvez utiliser
interruption code> de la même manière: p>
xxx pré> Il vous permet d'abandonner l'évaluation ou d'entrer la sous-session (identique à la boîte de dialogue
[ ] code> est dans la réponse d'Arnoud). P>
Vous pouvez également étendre cette approche pour imprimer l'affirmation qui a échoué: P>
$AssertFunction := (Print[HoldForm @@ #]; Interrupt[]) &;
Quel type d'erreur de «débogage» fais-vous référence?
J'ai bien peur de ne pas en savoir assez pour répondre intelligemment à cette question. Avez-vous une référence ou simplement une suggestion sur ce que je devrais rechercher dans la documentation, en savoir plus sur les messages de débogage?
Trouvez le tout premier message émis, le nom du message a le formulaire
symbole :: msgname code>. Postez cela, si vous le feriez.
@RJKAppan Qu'est-ce que vous appelez "Erreurs de débogage", apparaissent-ils dans une fenêtre séparée avec un fond rose ou apparaissent-ils dans votre ordinateur portable et ressemblent à "somesymbol :: msg description"?
Ils apparaissent dans le cahier et ressemblent à "somesymbol :: msg description". Principalement, j'aimerais que mon ordinateur portable cesse d'exécuter une erreur d'affirmation.