2017-07-25 1 views
0

Je ne sais pas exactement comment demander ce que je demande, et je ne sais pas si un exemple de code serait vraiment pertinent ici, donc si une clarification est nécessaire, il suffit de demander.Provoque un événement en Python lorsqu'une erreur se produit?

J'ai un programme non-trivial en Python qui fait quelques choses. Il lit à partir de certaines tables de base de données SQL Server, exécute du DDL dans SQL Server (les deux avec pyodbc), analyse certaines données et dispose d'une interface graphique pour tout orchestrer afin que les utilisateurs à l'avenir puissent automatiser le processus.

Tout fonctionne comme il se doit, mais évidemment, je ne m'attends pas à ce que les futurs utilisateurs jouent toujours selon les règles. Je peux indiquer explicitement quelle entrée est incorrecte (c'est-à-dire les champs laissés vides), mais il y a pas mal de choses qui peuvent mal tourner. Les structures d'essai sont hors de question car elles causent quelques problèmes dans le web des choses qui se passent dans mon programme, dont certaines sont intégrées dans les ressources que j'utilise, sans mentionner que je sens que ce n'est probablement pas une bonne forme les avoir partout. Cela étant dit, je me demande s'il existe un moyen de provoquer un événement (probablement une boîte de dialogue indiquant qu'une erreur s'est produite), afin qu'un utilisateur sans vue de la fenêtre de sortie sache que quelque chose s'est mal passé . Ce serait bien si je pouvais aussi saisir le message d'erreur lui-même, mais ce n'est pas nécessaire. Je vais bien avec l'erreur qui se produit encore tant que le programme peut continuer si le problème est corrigé. Je ne sais pas si c'est possible, ou si c'est possible quelle forme il faudrait, comme quelque chose qui surveille la sortie ou écoute les erreurs, mais je suis ouvert à toutes les informations à ce sujet.

Merci

Répondre

2

Vous pouvez envelopper votre code avec un bloc try/except et nommez le Exception pour l'imprimer dans la boîte de dialogue, par exemple:

try: 

    # your code 

except Exception as e: 

    print(e) # change this to be in your dialog 

De cette façon, vous ne serez pas utiliser try/except plusieurs fois dans différents endroits et vous attraperez essentiellement Exception. L'autre façon est raise exceptions personnalisées pour chaque erreur et les attraper avec except.

Si vous ne voulez toujours pas à utiliser try/except du tout, peut-être commencer un thread de garder le contrôle de certaines variables (par un loop) et chaque fois que vous voulez commencer un événement d'erreur vous définissez simplement cette variable à True et le thread va démarrer la boîte de dialogue d'erreur. Par exemple:

import time 
import threading 

test1 = False 
test2 = False 

def errorCheck(): 
    while True: 
     if test1: 
      # start error dialog for error1 
     if test2: 
      # start error dialog for error2 
     time.sleep(0.1) 

if __name__ == '__main__': 
    t = threading.Thread(target=errorCheck) 
    t.daemon = True 
    t.start() 
    # start your app 

Cependant, je recommande d'utiliser try/except à la place.

+0

J'espérais ne pas avoir à utiliser try/except mais il me semble que c'est la seule option. Je combine try/except et threading, car j'avais un peu de threading en cours, et ça semble fonctionner un peu pour le moment. Merci! –