Yanıtlar:
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ı?
e.messageçünkü args[0]aslında bir mesaj olmayabilir.
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).
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 .
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
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
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".
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.
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")'
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).
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}