Python'da istisna değeri elde etme


239

Bu kod varsa:

try:
    some_method()
except Exception, e:

Bu İstisna değerini nasıl alabilirim (dize ile ifade etmek istedim)?

Yanıtlar:


323

kullanım str

try:
    some_method()
except Exception as e:
    s = str(e)

Ayrıca, çoğu istisna sınıfının bir argsniteliği olacaktır . Genellikle args[0]bir hata mesajı olur.

strHata mesajı yoksa sadece kullanmanın boş bir dize döndüreceği unutulmamalıdır.repr birlikte pyfunc önerdiği gibi kullanım en azından istisnanın sınıfını gösterecektir. Benim almam, eğer onu yazdırıyorsanız, sınıfın ne olduğunu umursamayan ve sadece bir hata mesajı isteyen bir son kullanıcı için.

Gerçekten uğraştığınız istisna sınıfına ve nasıl somutlaştırıldığına bağlıdır. Özellikle aklınızda olan bir şey var mı?


Bunu bir rapor hazırlamak için yazdırıyorum, str (e) sanırım iyi. Çok teşekkürler
Frias

8
Kullanmayı tercih ederim e.messageçünkü args[0]aslında bir mesaj olmayabilir.
cedbeu

3
repr (e), istisnayı tam olarak almak istiyorsanız da yararlıdır (örn. NameError ("global ad 'değişken" tanımlanmamış ",) yerine" global ad' değişken "tanımlanmamış"
Ben Morris

49
böyle unicode istisnalar için başarısız olacak şekilde bu yanıt, tehlikelidir: raise Exception(u'jörn'). Başarısızlık özellikle kötüdür, çünkü gerçek istisnayı asla göremezsiniz, sadece a UnicodeDecodeError. İstisnanın kodlamasını bilmiyorsanız (ve çoğu zaman bilmiyorsunuz), üzerinde çalışmalısınız repr(e)veya gerçekten ihtiyacınız varsa, istisna işlemenizde UnicodeDecodeErrors'u yakalayıp geri düşen başka bir try-hariç blok kullanın repr(e).
Jörn Hees

11
@ JörnHees ile aynı fikirde. Ben kaç kez saymak olamaz str(hatta unicodeveya .format) nedeniyle Unicode elleçleme Hataları neden oldu. Hata iletisi içeriği üzerinde tam denetime sahip değilseniz, reprbeklenmedik Unicode hatalarını önlemek için DAİMA kullanın .
Kenny Trytek

186

Repr () öğesini kullanın ve repr ve str kullanma arasındaki fark

Kullanma repr:

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

Kullanma str:

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

2
ah repro başka bir şey gibi görünüyor, kullanışlı sayesinde unicode, strşifreleyen, ... girişe bağlı bir duruma neden olabilir. Bakmak için istisna tutmaya çalışırken oldukça yararlı değil, ama repr exception-safeöyle görünüyor
dashesy

2
Bu, herhangi bir benzeri çözümden çok daha iyidir str(), çünkü aslında istisna türünü içerir. İle str()aldığım 'status'ile yaparken repr()aldığım KeyError('status')ve ben gibiydi "Aaaaah, şimdi hatasını anlıyorum".
jlh

27

Bunun eski bir soru olduğunu fark etsem de, modülün kullanılmasını önermek istiyorumtraceback etsem de, istisnaların çıktısını işlemek .

Kullanım traceback.print_exc()buna yakalanmamış kalmıştır eğer basılmış olacaktır, ya da sadece gibi, standart hata mevcut durum yazdırmak için traceback.format_exc()bir dize olarak aynı çıktıyı almak için. Çıktıyı sınırlamak veya yazdırmayı dosya benzeri bir nesneye yeniden yönlendirmek istiyorsanız, bu işlevlerden birine çeşitli bağımsız değişkenler iletebilirsiniz.


23

Başka bir yol henüz verilmemiştir:

try:
    1/0
except Exception, e:
    print e.message

Çıktı:

integer division or modulo by zero

args[0] aslında bir mesaj olmayabilir.

str(e)dizeyi çevreleyen tırnak işaretleriyle ve büyük olasılıkla uunicode ise baş harfiyle döndürebilir :

'integer division or modulo by zero'

repr(e) muhtemelen istediğiniz gibi olmayan tam istisna temsilini verir:

"ZeroDivisionError('integer division or modulo by zero',)"

Düzenle

Benim hatam !!! Görünüşe göre BaseException.message , kullanımdan kaldırılmış2.6 gibi görünüyor , nihayet, istisna mesajlarını görüntülemek için hala standartlaştırılmış bir yol olmadığı görülüyor. Sanırım Yani iyi ile anlaşma yapmaktır e.argsve str(e)ihtiyaçlarınıza bağlı (ve muhtemelene.message kullandığınız lib o mekanizma güvenerek ise).

Örneğin, ile pygraphviz, e.messageistisnayı doğru bir şekilde görüntülemenin tek yolu str(e),u'' .

Ancak MySQLdb, mesajı almanın doğru yolue.args[1] : e.messageboş ve str(e)görüntülenecek'(ERR_CODE, "ERR_MSG")'


0

Python2 e.messageiçin, istisna mesajı almak için kullanmak daha iyidir , bu mümkün olacaktır UnicodeDecodeError. Ancak evet e.message, bazı istisnalar için boş olacaktır OSError, bu durumda exc_info=Truehatayı kaçırmamak için günlükleme işlevimize bir ekleyebiliriz .
Python3 için, bence kullanmak güvenli str(e).


0

Hatanın türünü / kaynağını bilmiyorsanız deneyebilirsiniz:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

Ancak unutmayın, pep8 uyarısı alırsınız:

[W] PEP 8 (E722): do not use bare except

0

Hata mesajını incelemek ve onunla bir şeyler yapmak için (Python 3 ile) ...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.