9
votes

Comment dire à Mathematica d'arrêter une erreur de débogage

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.


5 commentaires

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 . 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.


4 Réponses :


14
votes

3 commentaires

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]



8
votes

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: xxx pré>

notez comment 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>

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> xxx pré>

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> xxx pré>

si peut être pratique pour ne pas quitter le noyau si certains messages sont émis. À cette fin, checkquit code> accepte un deuxième argument facultatif pouvant être utilisé pour spécifier les messages d'intérêt: p> xxx pré>

Notez comment le noyau n'a pas été excité Puisque le message ne correspond pas à 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!


0 commentaires

7
votes

En plus des autres réponses, vous voudrez peut-être enquêter à l'aide de: xxx

qui vous permet d'exécuter du code lorsque n'importe quel message est déclenché.

Par exemple, vous Peut évaluer ceci: xxx

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: xxx

qui vous ramène à la boucle principale (l'évaluation principale puis se termine ou casse dans un nouveau message).


3 commentaires

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



5
votes

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[]) &;


0 commentaires