3 Stimmen

Benutzerdefinierte Ausnahmebehandlung in Python

Ich habe zwei Module, main und notmain. Ich habe meine benutzerdefinierte Ausnahme im Hauptmodul deklariert und möchte sie abfangen. Diese Ausnahme wird im notmain-Modul ausgelöst. Das Problem ist, dass ich meine im notmain-Modul ausgelöste Ausnahme nicht abfangen kann.

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

Ich habe verschiedene Importmethoden ausprobiert, mit demselben Ergebnis. Wenn ich main.py ausführe, sehe ich dies:

<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

Das bedeutet, dass die Ausnahme irgendwie abgefangen wurde, aber warum sehe ich einen Traceback? Und warum hat die Ausnahmeklasse den Namen "main.MyException"?

Wenn ich nun main.py ein wenig modifiziere und ausführe:

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

Ich werde sehen, was erwartet wird:

<class '__main__.MyException'>
ops

Ich weiß nicht, warum diese Klasse MyException unterschiedliche Namen in main.py und in notmain.py hat? Und warum kann Python sie nicht wie erwartet abfangen?

Vielen Dank :)

8voto

Denis Otkidach Punkte 30334

Ihr Modul main wird zweimal importiert (als main y __main__ ), die jeweils ihre eigene Klasse haben MyException . Sie sollten in Erwägung ziehen, Ihre Anwendung umzugestalten, um zirkuläre Importe zu vermeiden.

1voto

Rasmus Kaj Punkte 3887

En __main__ name, mit Unterstrichen, ist ein automatischer Namensraum für das aufgerufene Programm. Eine Abhilfe wäre, die Ausnahme in einer dritten Datei zu deklarieren (oder eine dritte Datei zu haben, die das vom Benutzer aufgerufene Programm ist, und nur eine einzige Methode in Ihrem "echten" Programm).

Auch die Art und Weise, wie Sie notmain importieren, kann etwas damit zu tun haben. Warum nicht einfach "from notmain import func"?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X