Jeśli mam ten kod:
try:
some_method()
except Exception, e:
Jak mogę uzyskać tę wartość wyjątku (mam na myśli reprezentację ciągu)?
posługiwać się str
try:
some_method()
except Exception as e:
s = str(e)
Ponadto większość klas wyjątków będzie miała args
atrybut. Często pojawia args[0]
się komunikat o błędzie.
Należy zauważyć, że samo użycie str
zwróci pusty ciąg, jeśli nie ma komunikatu o błędzie, podczas gdy użycie repr
zgodnie z zaleceniami pyfunc spowoduje przynajmniej wyświetlenie klasy wyjątku. Uważam, że jeśli drukujesz to, jest to dla użytkownika końcowego, który nie dba o to, czym jest klasa i chce tylko komunikat o błędzie.
To naprawdę zależy od klasy wyjątku, z którym mamy do czynienia, i od tego, w jaki sposób jest on tworzony. Czy miałeś na myśli coś konkretnego?
e.message
ponieważargs[0]
może nie być tak naprawdę wiadomością.raise Exception(u'jörn')
. Awaria jest szczególnie zła, ponieważ nigdy nie zobaczysz faktycznego wyjątku, ale tylkoUnicodeDecodeError
. Jeśli nie znasz kodowania wyjątku (a przez większość czasu tego nie wiesz), powinieneś albo pracować,repr(e)
albo jeśli naprawdę potrzebujesz, użyj innego bloku try-wyjątku w obsłudze wyjątków, który przechwytuje błędy UnicodeDecodeErrors i wraca dorepr(e)
.str
(lub nawetunicode
lub.format
) spowodowało błędy z powodu obsługi Unicode. Jeśli nie masz pełnej kontroli nad treścią komunikatu o błędzie, ZAWSZE używaj,repr
aby uniknąć nieoczekiwanych błędów Unicode.Używanie
repr
:Używanie
str
:źródło
repr
jest użyteczne dzięki, wydaje się cokolwiek innegounicode
,str
kodującego ... może podnieść wyjątek w zależności od wejścia. Nie całkiem przydatne, gdy staramy się zachować wyjątek, ale wygląda na to,exception-safe
że wygląda na tostr()
rozwiązanie, ponieważ w rzeczywistości zawiera typ wyjątku. Kiedystr()
dostałem'status'
,repr()
dostałemKeyError('status')
i byłem jak „aaaaah, teraz rozumiem błąd”.Chociaż zdaję sobie sprawę, że to stare pytanie, chciałbym zasugerować użycie
traceback
modułu do obsługi danych wyjściowych wyjątków.Służy
traceback.print_exc()
do drukowania bieżącego wyjątku do standardowego błędu, tak jak zostałby wydrukowany, gdyby nie został przechwycony, lubtraceback.format_exc()
do uzyskania takiego samego wyniku jak ciąg. Możesz przekazać różne argumenty do dowolnej z tych funkcji, jeśli chcesz ograniczyć wyjście lub przekierować drukowanie do obiektu podobnego do pliku.źródło
Nie podano jeszcze innego sposobu:
Wynik:
args[0]
może nie być wiadomością.str(e)
może zwrócić ciąg z otaczającymi go cudzysłowami i być może z wiodącym,u
jeśli unicode:repr(e)
daje pełną reprezentację wyjątku, która prawdopodobnie nie jest tym, czego chcesz:edytować
Mój błąd !!! Wygląda na to że
BaseException.message
został wycofany2.6
, a ostatecznie zdecydowanie wydaje się, że nadal nie ma standardowego sposobu wyświetlania komunikatów o wyjątkach. Sądzę więc, że najlepiej jest zająć się twoimi potrzebamie.args
istr(e)
zależnie od nich (i być możee.message
jeśli używana biblioteka bazuje na tym mechanizmie).Na przykład z
pygraphviz
,e.message
jest to jedyny sposób, aby wyświetlać prawidłowo wyjątku, stosującstr(e)
otoczą wiadomość zu''
.Ale
MySQLdb
właściwym sposobem na odzyskanie wiadomości jeste.args[1]
:e.message
jest pusta istr(e)
wyświetli się'(ERR_CODE, "ERR_MSG")'
źródło
W przypadku python2 lepiej jest użyć,
e.message
aby uzyskać komunikat wyjątku, pozwoli to uniknąć możliwegoUnicodeDecodeError
. Ale take.message
będzie puste dla niektórych wyjątków, takich jakOSError
, w którym to przypadku możemy dodaćexc_info=True
do naszej funkcji logowania, aby nie przegapić błędu.W przypadku python3 myślę, że można go bezpiecznie używać
str(e)
.źródło
Jeśli nie znasz typu / źródła błędu, możesz spróbować:
Ale pamiętaj, otrzymasz ostrzeżenie pep8:
źródło
Aby sprawdzić komunikat o błędzie i coś z nim zrobić (w Pythonie 3) ...
źródło