Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Christian Barthel Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Exception erneut werfen (re-raise) Date: Sun, 23 Jun 2019 17:42:51 +0200 Lines: 84 Message-ID: <875zow5mv8.fsf@x230.onfire.org> References: <87blyo5zqn.fsf@x230.onfire.org> <7898859.zcJcWZ0syB@palindrom> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net DITmxK0sii1UKweqUXMU2AX6/htUt2UXvL9JA53lhIz96epBZ3 Cancel-Lock: sha1:/hCgr06OuSO6dg+x8tymph0Mv5c= sha1:OOiz+Rn57VLs5vSxPE98HN3ysKY= User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (berkeley-unix) Xref: csiph.com de.comp.lang.python:5508 Peter Otten <__peter__@web.de> writes: > Christian Barthel wrote: > [..] >> >> def foo(): >> assert 0 == 1 >> >> def bar(): >> someVar = .. >> try: >> foo() >> except AssertionError as e: >> raise AssertionError('foo ' + str(foo)) from e >> >> Somit kann ein Aufrufer von bar() die Belegung von foo in einer >> Fehlermeldung einbauen und die Daten der Ursprünglichen Exception >> sind weiter vorhanden. Mich würde interessieren ob es eine >> Alternative oder einfachere Möglichkeit dazu geben würde und wie >> (erfahrenere) Python Programmierer das lösen würden? > > foo in deinem Beispiel ist allerdings eine globale Variable. Tut mir Leid, ich meinte nicht `foo` in dem Fall sondern `someVar`. Hatte ich mich beim aufbauen des Beispiels verschaut. > Wenn es nur darum geht, lokale Variablen im Callstack zu inspizieren, kommst > du auch ohne erneutes try...except aus: > > $ cat traceback_locals.py > import sys > > def f(n): > if n: return f(n-1) > assert False > > try: > f(3) > except: > etype, exc, tb = sys.exc_info() > while True: > tb = tb.tb_next > if tb is None: > break > print(tb.tb_frame.f_locals) > > $ python3 traceback_locals.py > {'n': 3} > {'n': 2} > {'n': 1} > {'n': 0} Ok, das ist sicherlich auch ein interessanter Weg der mir so noch nicht bekannt war. Danke! Was ich in meinem Beispiel nicht erwähnt habe ist, dass einige Informationen auch als Instanzvariablen der Klasse existieren. Diese müssten dann aus f_globals entnommen werden. [..] > Oft will man allerdings gezielt zusätzliche Informationen übermitteln oder > Lowlevel-Exceptions in anwendungsspezifische Ausnahmen "übersetzen". Dann > ist dein Vorgehen das Mittel der Wahl. Genau, das ist eigenlich das Hauptziel der Sache: zusätzliche Informationen gezielt noch aufzubereiten und für den Aufrufer zugänglich zu machen um erweiterte Diagnosen zu ermöglichen. > Ich ziehe jedoch unbearbeitete Werte vor, die man bei Bedarf > nicht mühsam aus einem String herausoperieren muss, also in > etwa [..] Das ich hier in dem Fall einen String verwendete war ebenso nur illustrativ: Ich habe mir dazu ebenfalls eigene Exception Klassen gebaut die z.B. den HTTP Status Code beinhalten und weitere Parameter wie etwa Proxy Einstellungen und tatsächlich ausgeführter HTTP Befehl. Danke für die Antwort! -- Christian Barthel