Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Peter Otten <__peter__@web.de> Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Exception erneut werfen (re-raise) Date: Sun, 23 Jun 2019 15:24:21 +0200 Organization: None Lines: 84 Message-ID: References: <87blyo5zqn.fsf@x230.onfire.org> <7898859.zcJcWZ0syB@palindrom> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de zcisB/0qIAoAEELusXfscQsjRm2DeMcKg3TKQSo0qWGg== Return-Path: <__peter__@web.de> X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1561296272; bh=IMFcr/zvwWDWIPeWcJveaeXyysCpcHP+RTyzeWFUiQ8=; h=X-UI-Sender-Class:From:To:Subject:Date:In-Reply-To:References; b=Dme/ivOFfOI/z4aFQzeVvBhTxXuwPwCXQBr+kUkumAyWbc+bOvrkHZuT9fLZUU1yR 0YBEF/gamcsodXD19JTkaboxNAs7dCcCGiPAsXpjwHu/yzPpDUncJDIbXk6CjaSjKL JKjxKh03n0WEFgJvt/KfSBnAGL2FjY4gf1oclGr0= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 User-Agent: KMail/4.13.3 (Linux/3.13.0-170-generic; KDE/4.13.3; x86_64; ; ) In-Reply-To: <87blyo5zqn.fsf@x230.onfire.org> X-Provags-ID: V03:K1:dHT8i2jUyEwFjFmsvmh0P8nKsbxdvgLJZvj/0srUBh4eJ4yJnse Zh2efN7I+VeyHPVXEipwAK1o7X6maVDbTLXSux7pCHAfdkcNQE1r/cx0A0FDpiyyf7CiEpg kLb+FYoEjuBQRjQldrpJ9uAT0S84YlhjPGlhYY87t04bi0Z6Q4KYSK+9OCkxHyX6OTXjeaj 4wk1GucgZ0zXZobzCELzw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:qnOifCQqL20=:EJr7XR658Qcsl9ipMAJdQb kvfg7g5y4PapXXY9lv00VoWBF65A+eOeABZKrgy7bSVCrbDagS+LdLowwwZjR/HQxvxchkjAk +L+h9lUZ5CODLc84Bea3yigUpOVCTToZirWcicB3fi9XZLxlu7lRaPtHqL0JWD8UJHnqdfOub MHiFyS55CjeKKut0ltbNqt6nyCJjkoexFg7ewh2kU0BxaAS5SRuspDkaT0JRiK7qhXv4pzfWS Og0KARvnFz2bzmp4Ntq4EL6OhYHZZWgAJDWg2Q1dely7Jt9EJLa/4w5UsXtMF0ct2b9AUxw8j 77JIkI3pu7s/8lpmvd8Mja8FricbyUzL/IZbbd6yNO0ttFMo/4Y974Avx4hPl0Kp8u5jWJZfW KjeDoqapM66TXbDAR8swuf/TyV5vZRqes+UcScxrD9le0ZApaVK8ktZX23mwKlQ6mUlKMpmDL 40h5tWoMJI6K5vb5paCfhNx8pHpanRDKRBDTjLOIcMLonB8dvsTUX40xHqj5BIqdlKp70emO2 tNljwEGOTTsipvcLhvHSMJ0Nf6G1wLJPSFss+XVB9+/9u+Sd6evjSBKHb6zZKd7oYNKwPKhgX +MywlUdNCWV1JD+yvotMTh1aFI5ZoGDJqrElnCYUPxpyeDC2vPKttPAWn02JNhBHgKe8aCHPc 4YKEG3J/IKwr5vqJEkyrN/kCPx1avTJ+q+0CK+QBX16DcEx80g+M/Xv0xewq2BlKcdzfi8pK/ xoj//fHV/8FYS1cpvmBq/il9pnIHzUAQmH0QPB1DJ+UzMhgOqIYVjf0anO9iQ6R2Vt0u4fppr SeObFZITMPxASKYtj54so0G4uRZOU/7UtlSk6nZOj62sPGtV0tdMBugaZ2RNusKpF8er929iA rn/reCrcztw09nHDjT5F0jbiadTB7B2SRR1/0M4bdpu4LvxlgQ+/xLZr9TulJCU0zQebdUxXI jn9ezBuDI5uBO4SbGBu8JleLG0BN1mF9btYFV3GjGszbBNzMKXSkQ X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <7898859.zcJcWZ0syB@palindrom> X-Mailman-Original-References: <87blyo5zqn.fsf@x230.onfire.org> Xref: csiph.com de.comp.lang.python:5506 Christian Barthel wrote: > Ich habe einen Code-Auszug der eine HTTP Bibliothek (requests > Modul) nutzt. Diese wirft unterschiedliche Exceptions die ich > auffange. Ich w=FCrde aber gerne die Exception an dieser Stelle > noch nicht fangen, sondern im Prinzip an den Aufrufer weitergeben > damit ich dann alle Exceptions in der Hauptschleife zentral > fangen kann und Loggen kann. >=20 > Dies geht; allerdings verliere ich dann die M=F6glichkeit auf die > lokalen Variablen der innersten Funktion (dort wo der Request > erzeugt und konstruiert wird) zuzugreifen. >=20 > Meine Idee im Moment w=E4re mittels "raise .. from.." eine neue > Exception zu generieren und die zus=E4tzlichen Parameter als > Argumente mitzugeben. Illustrativ und vereinfacht w=FCrde das in > etwa so aussehen: > =20 > def foo(): > assert 0 =3D=3D 1 > =20 > def bar(): > someVar =3D .. > try: > foo() > except AssertionError as e: > raise AssertionError('foo ' + str(foo)) from e > =20 > Somit kann ein Aufrufer von bar() die Belegung von foo in einer > Fehlermeldung einbauen und die Daten der Urspr=FCnglichen Exception > sind weiter vorhanden. Mich w=FCrde interessieren ob es eine > Alternative oder einfachere M=F6glichkeit dazu geben w=FCrde und wie > (erfahrenere) Python Programmierer das l=F6sen w=FCrden? foo in deinem Beispiel ist allerdings eine globale Variable. Wenn es nur darum geht, lokale Variablen im Callstack zu inspizieren, k= ommst=20 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 =3D sys.exc_info() while True: tb =3D tb.tb_next if tb is None: break print(tb.tb_frame.f_locals) =20 $ python3 traceback_locals.py=20 {'n': 3} {'n': 2} {'n': 1} {'n': 0} Das ist nur zur Demonstration, Editoren/IDEs mit Python-Support sollten= den=20 Zugriff auf den Callstack bieten, ohne dass du eine Zeile extra schreib= en=20 musst. Oft will man allerdings gezielt zus=E4tzliche Informationen =FCbermitte= ln oder=20 Lowlevel-Exceptions in anwendungsspezifische Ausnahmen "=FCbersetzen". = Dann=20 ist dein Vorgehen das Mittel der Wahl. Ich ziehe jedoch unbearbeitete=20= Werte vor, die man bei Bedarf nicht m=FChsam aus einem String herausope= rieren=20 muss, also in etwa class MyAssertionError(AssertionError): def __init__(self, message, foo=3DNone): super().__init__(message, foo)=20 self.foo =3D foo