Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5506

Re: [Python-de] Exception erneut werfen (re-raise)

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 <mailman.5.1561296279.29664.python-de@python.org> (permalink)
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 <python-de.python.org>
List-Unsubscribe <https://mail.python.org/mailman/options/python-de>, <mailto:python-de-request@python.org?subject=unsubscribe>
List-Archive <http://mail.python.org/pipermail/python-de/>
List-Post <mailto:python-de@python.org>
List-Help <mailto:python-de-request@python.org?subject=help>
List-Subscribe <https://mail.python.org/mailman/listinfo/python-de>, <mailto:python-de-request@python.org?subject=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

Show key headers only | View raw


Christian Barthel wrote:

> Ich habe einen Code-Auszug der eine HTTP Bibliothek (requests
> Modul) nutzt.  Diese wirft unterschiedliche Exceptions die ich
> auffange.  Ich würde 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.
> 
> Dies geht; allerdings verliere ich dann die Möglichkeit auf die
> lokalen Variablen der innersten Funktion (dort wo der Request
> erzeugt und konstruiert wird) zuzugreifen.
> 
> Meine Idee im Moment wäre mittels "raise .. from.." eine neue
> Exception zu generieren und die zusätzlichen Parameter als
> Argumente mitzugeben.  Illustrativ und vereinfacht würde das in
> etwa so aussehen:
>  
>    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.

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}

Das ist nur zur Demonstration, Editoren/IDEs mit Python-Support sollten den 
Zugriff auf den Callstack bieten, ohne dass du eine Zeile extra schreiben 
musst.

Oft will man allerdings gezielt zusätzliche Informationen übermitteln oder 
Lowlevel-Exceptions in anwendungsspezifische Ausnahmen "übersetzen". Dann 
ist dein Vorgehen das Mittel der Wahl. Ich ziehe jedoch unbearbeitete 
Werte vor, die man bei Bedarf nicht mühsam aus einem String herausoperieren 
muss, also in etwa

class MyAssertionError(AssertionError):
    def __init__(self, message, foo=None):
        super().__init__(message, foo) 
        self.foo = foo

Back to de.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Exception erneut werfen (re-raise) Christian Barthel <bch@online.de> - 2019-06-23 13:04 +0200
  Re: [Python-de] Exception erneut werfen (re-raise) Peter Otten <__peter__@web.de> - 2019-06-23 15:24 +0200
    Re: [Python-de] Exception erneut werfen (re-raise) Christian Barthel <bch@online.de> - 2019-06-23 17:42 +0200

csiph-web