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 args
niteliği olacaktır . Genellikle args[0]
bir hata mesajı olur.
str
Hata 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 unicode
veya .format
) nedeniyle Unicode elleçleme Hataları neden oldu. Hata iletisi içeriği üzerinde tam denetime sahip değilseniz, repr
beklenmedik 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
repr
o 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 u
unicode 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.args
ve 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.message
istisnayı doğru bir şekilde görüntülemenin tek yolu str(e)
,u''
.
Ancak MySQLdb
, mesajı almanın doğru yolue.args[1]
: e.message
boş ve str(e)
görüntülenecek'(ERR_CODE, "ERR_MSG")'
Python2 e.message
iç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=True
hatayı 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}