2010-12-01 13 views
14

J'ai du code qui gère une exception, et je ne veux faire quelque chose de spécifique que s'il s'agit d'une exception spécifique, et seulement en mode debug. Ainsi, par exemple:Gérer le type d'exception spécifique en python

try: 
    stuff() 
except Exception as e: 
    if _debug and e is KeyboardInterrupt: 
     sys.exit() 
    logging.exception("Normal handling") 

En tant que tel, je ne veux pas ajouter seulement:

except KeyboardInterrupt: 
    sys.exit() 

parce que je suis en train de garder la différence dans ce code de débogage minimal

+1

qu'est-ce que réellement vous demandez-vous? – Marii

Répondre

18

Eh bien, vraiment, vous devriez probablement garder le gestionnaire pour KeyboardInterrupt séparés. Pourquoi voudriez-vous seulement gérer les interruptions du clavier en mode débogage, mais les avaler autrement?

Cela dit, vous pouvez utiliser isinstance pour vérifier le type d'un objet:

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logger.exception("Normal handling") 
+0

Ceci est sur un système embarqué fonctionnant sans shell. Donc, nous pourrions seulement obtenir une interruption du clavier en mode débogage. Nous gérons simplement toutes les exceptions. – Falmarri

+0

isinstance. c'est ce que je cherche. thx – Falmarri

19

Cette est à peu près la façon dont c'est fait.

try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     sys.exit() 
    logging.exception("Normal handling") 
except Exception as e: 
    logging.exception("Normal handling") 

La répétition est minimale. Pas zéro, cependant, mais minime. Si le "traitement normal" est plus d'une ligne de code, vous pouvez définir une fonction pour éviter la répétition des deux lignes de code.

+0

Vous me battez de 30 secondes, je pense – Velociraptors

+0

C'est "sauf Exception, e:" – marcog

+5

@marcog: 'except Exception as e' est valide en Python 2.6+. – mipadi

0

Quel est le problème avec

try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     logging.exception("Debug handling") 
     sys.exit() 
    else: 
     logging.exception("Normal handling") 
0

Soit utiliser la méthode standard mentionné dans les autres réponses, ou si vous voulez vraiment tester dans le bloc, sauf vous pouvez alors utiliser isinstance().

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logging.exception("Normal handling") 
1

Vous devez laisser la bulle KeyboardInterrupt tout le chemin et le piéger au plus haut niveau.

if __name__ == '__main__': 
    try: 
     main() 
    except KeyboardInterrupt: 
     sys.exit() 
    except: 
     pass 

def main(): 
    try: 
     stuff() 
    except Exception as e: 
     logging.exception("Normal handling") 
     if _debug: 
      raise e 
0
try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     sys.exit() 
    logging.exception("Normal handling") 
except ValueError: 
    if _debug: 
     sys.exit() 
    logging.exception("Value error Normal handling") 
else: 
    logging.info("One more message without exception") 
+1

-1: 'else' devrait être 'except', la clause 'else' est pour que le code soit exécuté s'il n'y a pas d'exception. –

+0

Oui, la branche 'else' sera exécutée s'il n'y a pas d'exception. C'est juste par exemple. Mais vous avez raison, je devrais éditer l'exemple de code pour montrer l'état du programme "réel". – Lex

0

Vous pouvez nommer des exceptions spécifiques en Python:

try: 
    stuff() 
except KeyboardInterrupt: 
    sys.exit() 
except Exception: 
    normal_handling()