Partage
  • Partager sur Facebook
  • Partager sur Twitter

[sys.excepthook] ne pas quitter en cas d'erreur

Sujet résolu
Anonyme
    5 août 2015 à 18:45:10

    hello :)

    dans un nouveau projet, j'ai besoin de ne pas quitter après avoir display le traceback.

    du coup j'ai recréé un systeme d'exception (attention, je veux pas de pdb !) qui est appelé en cas d'erreur

    mon petit code :

    import analyser as als
    import sys
    import os
    import re
    import traceback
    import subprocess
    
    
    def post_mortem(exc_type, exc_val, exc_tb):
        taille_con = subprocess.Popen(['mode con'], stdout=subprocess.PIPE).stdout.read()
        taille_con = int(re.findall(r'[0-9]{1,3}', taille_con)[1])
        message_err = ["Une erreur fatale est surevenue.", "", ""]
        for i in message_err:
            print(" " * (taille_con // 2 - len(i) // 2) + i)
        #on affiche l'exception histoire de savoir ce qu'on debug
        print("".join(traceback.format_exception(exc_type, exc_val, exc_tb)))
        input("Appuyez sur Entrer pour relancer Janiswö ...")
        go()
    
    #on dit à python de lancer cette fonction quand il plante
    sys.excepthook = post_mortem
    
    
    def go():
        #on démarre l'analyser
        analyse_stx = als.Speaker()
        #on démarre le noyau
        analyse_stx.start()
    
    if __name__ == '__main__':
        go()


    et comme vous le voyez, j'aimerai entrer dans l'input, et reboot janiswö (mon prog), comme si de rien n'était

    mais évidemment ca ne marche pas :/

    merci à vous :)

    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2015 à 10:34:21

      Lubzorg a écrit:

      mais évidemment ca ne marche pas :/

      C'est toujours mieux d'expliciter ce qui ne fonctionne pas. Pour ma part, si je lance ce code minimaliste

      !/usr/bin/env python3

      -- coding: utf-8 --

      import sys import traceback

      def post_mortem(exc_type, exc_val, exc_tb):

      print("".join(traceback.format_exception(exc_type, exc_val, exc_tb)))
      input("Appuyez sur Entrer pour relancer go ...")
      go()
      

      def go():

      value = int(input("Entrez un nombre: "))
      print(value)
      

      sys.excepthook = post_mortem

      if name == 'main':

      go()
      
      </pre> Et que je rentre une lettre, je vois l'exception et la fonction go se relance.

      Je ne suis pas trop sûr de ce que tu essaies de faire avec le subprocess. Mais si tu veux récupérer ce qu'il y a dans son stdout, je te conseille de regarder à subprocess.check_output

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        6 août 2015 à 10:41:46

        ah nan nan le subprocess, c'est pour ouvrir un shell, lancer mode con, récupérer la taille en colonne de la console, et enfin centrer mon texte grace à ca. mais c'est vrai que c'est pas utile :D

        et ben j'ai testé ce code de post mortem une dizaine de fois et ... ca coupait quand meme la console :(

        et là je retest, et ca marche, l'erreur est "stopée" et janiswô peut se relancer :/

        un bon schrödinbug quoi :/

        ce qui ne fonctionnait pas était que post_mortem n'avait pas l'air d'intercepter le bug :/

        merci de ton aide :) je passe en résolu

        • Partager sur Facebook
        • Partager sur Twitter

        [sys.excepthook] ne pas quitter en cas d'erreur

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown