Odpowiedzi:
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 tylko UnicodeDecodeError
. 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 do repr(e)
.
str
(lub nawet unicode
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żyj repr () i Różnica między użyciem repr i str
Używanie repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
Używanie str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
jest użyteczne dzięki, wydaje się cokolwiek innego unicode
, 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 to
str()
rozwiązanie, ponieważ w rzeczywistości zawiera typ wyjątku. Kiedy str()
dostałem 'status'
, repr()
dostałem KeyError('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, lub traceback.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.
Nie podano jeszcze innego sposobu:
try:
1/0
except Exception, e:
print e.message
Wynik:
integer division or modulo by zero
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:
'integer division or modulo by zero'
repr(e)
daje pełną reprezentację wyjątku, która prawdopodobnie nie jest tym, czego chcesz:
"ZeroDivisionError('integer division or modulo by zero',)"
edytować
Mój błąd !!! Wygląda na to żeBaseException.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 potrzebami e.args
i str(e)
zależnie od nich (i być może e.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ąc str(e)
otoczą wiadomość z u''
.
Ale MySQLdb
właściwym sposobem na odzyskanie wiadomości jest e.args[1]
: e.message
jest pusta i str(e)
wyświetli się'(ERR_CODE, "ERR_MSG")'
W przypadku python2 lepiej jest użyć, e.message
aby uzyskać komunikat wyjątku, pozwoli to uniknąć możliwego UnicodeDecodeError
. Ale tak e.message
będzie puste dla niektórych wyjątków, takich jak OSError
, 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)
.
Aby sprawdzić komunikat o błędzie i coś z nim zrobić (w Pythonie 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}