2009-11-05 4 views
3

J'ai deux modules, principal et notmain. J'ai déclaré mon exception personnalisée dans le module principal et je veux l'attraper. Cette exception est levée dans le module notmain. Le problème est que je ne peux pas attraper mon exception soulevée dans le module notmain.Gestion des exceptions personnalisées en Python

main.py:

class MyException(Exception): 
    pass 

m = __import__('notmain') 
try: 
    m.func() 
except MyException as e: 
    print(type(e)) 
    print('ops') 

notmain.py:

def func(): 
    import main # 1 
    # from main import MyException # 2 
    # from main import MyException as MyException # 3 

    raise main.MyException # 1 
    # raise MyException # 2, 3 

J'ai essayé différentes méthodes d'importation, avec le même résultat. Quand je lance main.py, je vois ceci:

<class 'main.MyException'> 
ops 
Traceback (most recent call last): 
    File "D:\exception\main.py", line 6, in <module> 
    m.func() 
    File "D:\exception\notmain.py", line 6, in func 
    raise main.MyException # 1 
main.MyException 

Cela signifie exception est en quelque sorte pris, mais pourquoi je vois retraçage? Et pourquoi la classe d'exception a le nom "main.MyException"?

Maintenant, si je modifie main.py un peu et l'exécuter:

try: 
    raise MyException 
except MyException as e: 
    print(type(e)) 
    print('ops') 

Je vais voir ce que l'on attend:

<class '__main__.MyException'> 
ops 

Je ne sais pas pourquoi cette MyException classe a différentes noms dans main.py et dans notmain.py? Et pourquoi Python ne peut pas l'attraper comme prévu?

Merci :)

Répondre

8

Votre module main est importé deux fois (comme main et __main__), chacun ayant sa propre classe MyException. Vous devriez envisager de revoir votre demande pour éviter les importations circulaires.

1

Le nom __main__, avec des traits de soulignement, est un espace de nom automatique pour le programme appelé. Une solution de contournement serait de déclarer l'exception dans un troisième fichier (ou avoir un troisième fichier qui est le programme appelé par l'utilisateur, et juste une seule méthode dans votre programme "réel").

En outre, la façon dont vous importez notmain peut avoir quelque chose à voir avec cela. Pourquoi ne pas simplement "à partir de notmain import func"?

+0

Merci. J'importe les modules dynamiquement (je ne connais que le nom du module en cours d'exécution), donc __import__ est le seul moyen de le faire. – demalexx