Podczas debugowania kodu Pythona w interaktywnym monicie (REPL), często napiszę kod, który podnosi wyjątek, ale nie zapakowałem go w try
/except
, więc gdy błąd zostanie podniesiony, mam na zawsze utracił obiekt wyjątku.Jak uzyskać ostatni obiekt wyjątku po zgłoszeniu błędu w pytaniu Python?
Często komunikat traceback i komunikat o błędzie Python nie wystarcza. Na przykład podczas pobierania adresu URL serwer może zwrócić błąd 40x i potrzebujesz treści odpowiedzi przez error.read()
... ale nie masz już obiektu błędu. Na przykład:
>>> import urllib2
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
urllib2.HTTPError: HTTP Error 400: Bad Request
Drat, co mówi ciało odpowiedzi? Prawdopodobnie zawierał cenne informacje o błędzie ...
Zdaję sobie sprawę, że zwykle łatwo jest ponownie uruchomić kod zawinięty w try/except, ale to nie jest idealne. Zdaję sobie również sprawę, że w tym konkretnym przypadku, gdybym używał biblioteki requests
(która nie podnosi błędów HTTP), nie miałbym tego problemu ... ale naprawdę zastanawiam się, czy istnieje bardziej ogólny sposób ostatni obiekt wyjątku w pytaniu Python w tych przypadkach.
Bardzo ładny, dziękuję! Działa jak udokumentowane. Dziwne, że moje poszukiwania Google nie znalazły tego, ale no cóż. (Pomimo bycia dość wytrawnym programistą Pythona, codziennie uczę się czegoś o Pythonie lub jego standardowych bibliotekach ...) –
@BenHoyt FYI, zgodnie z dokumentacją 'sys'," Te trzy są dostępne tylko w sesji interaktywnej po traceback został wydrukowany. ". – satoru
@satoru Cóż, oczywiście. W normalnym programie nieobsługiwany wyjątek zakończy program. – Cairnarvon