Jika saya memiliki kode itu:
try:
some_method()
except Exception, e:
Bagaimana saya bisa mendapatkan nilai Pengecualian ini (representasi string yang saya maksud)?
menggunakan str
try:
some_method()
except Exception as e:
s = str(e)
Selain itu, sebagian besar kelas pengecualian akan memiliki args
atribut. Seringkali, args[0]
akan ada pesan kesalahan.
Perlu dicatat bahwa hanya menggunakan str
akan mengembalikan string kosong jika tidak ada pesan kesalahan sedangkan menggunakan repr
sebagai pyfunc merekomendasikan setidaknya akan menampilkan kelas pengecualian. Menurut saya, jika Anda mencetaknya, itu untuk pengguna akhir yang tidak peduli apa kelasnya dan hanya menginginkan pesan kesalahan.
Ini benar-benar tergantung pada kelas pengecualian yang Anda hadapi dan bagaimana instantiated. Apakah Anda memiliki sesuatu yang khusus dalam pikiran?
e.message
karenaargs[0]
mungkin sebenarnya bukan pesan.raise Exception(u'jörn')
. Kegagalan itu terutama buruk, karena Anda tidak akan pernah melihat pengecualian aktual tetapi hanya aUnicodeDecodeError
. Jika Anda tidak tahu pengkodean pengecualian (dan sebagian besar waktu Anda tidak), Anda harus bekerja padarepr(e)
atau jika Anda benar-benar perlu, gunakan blok coba-kecuali lain dalam penanganan pengecualian Anda yang menangkap UnicodeDecodeErrors dan jatuh kembali kerepr(e)
.str
(atau bahkanunicode
atau.format
) telah menyebabkan bug karena penanganan Unicode. Jika Anda tidak memiliki kendali penuh atas isi pesan kesalahan, SELALU gunakanrepr
untuk menghindari kesalahan Unicode yang tidak terduga.Menggunakan
repr
:Menggunakan
str
:sumber
repr
ini berkat berguna, tampaknya apa pununicode
,str
, encoding, ... mungkin meningkatkan pengecualian tergantung pada masukan. Tidak cukup berguna ketika mencoba untuk menjaga pengecualian untuk melihat, tetapi reprexception-safe
tampaknyastr()
solusi seperti apa pun , karena itu sebenarnya termasuk jenis pengecualian. Denganstr()
saya'status'
sementararepr()
sayaKeyError('status')
dan saya seperti "aaaaah, sekarang saya mengerti kesalahan".Meskipun saya menyadari ini adalah pertanyaan lama, saya ingin menyarankan menggunakan
traceback
modul untuk menangani output dari pengecualian.Gunakan
traceback.print_exc()
untuk mencetak pengecualian saat ini ke kesalahan standar, sama seperti itu akan dicetak jika tetap tidak tertangkap, atautraceback.format_exc()
untuk mendapatkan hasil yang sama seperti string. Anda dapat meneruskan berbagai argumen ke salah satu fungsi tersebut jika Anda ingin membatasi output, atau mengalihkan pencetakan ke objek seperti file.sumber
Cara lain belum diberikan:
Keluaran:
args[0]
mungkin sebenarnya bukan pesan.str(e)
mungkin mengembalikan string dengan tanda kutip yang mengelilinginya dan mungkin dengan yang utamau
jika unicode:repr(e)
memberikan representasi pengecualian penuh yang mungkin bukan yang Anda inginkan:sunting
Salahku !!! Tampaknya
BaseException.message
sudah tidak digunakan lagi2.6
, akhirnya, tampaknya masih belum ada cara standar untuk menampilkan pesan pengecualian. Jadi saya kira yang terbaik adalah melakukan berurusan dengane.args
danstr(e)
tergantung pada kebutuhan Anda (dan mungkine.message
jika lib yang Anda gunakan bergantung pada mekanisme itu).Misalnya, dengan
pygraphviz
,e.message
adalah satu-satunya cara untuk menampilkan dengan benar pengecualian, menggunakanstr(e)
akan mengelilingi pesanu''
.Tetapi dengan
MySQLdb
, cara yang tepat untuk mengambil pesan adalahe.args[1]
:e.message
kosong, danstr(e)
akan ditampilkan'(ERR_CODE, "ERR_MSG")'
sumber
Untuk python2, Lebih baik digunakan
e.message
untuk mendapatkan pesan pengecualian, ini akan menghindari kemungkinanUnicodeDecodeError
. Tapi yae.message
akan kosong untuk beberapa jenis pengecualian sepertiOSError
, dalam hal ini kita dapat menambahkanexc_info=True
fungsi logging kita untuk tidak melewatkan kesalahan.Untuk python3, saya pikir aman untuk digunakan
str(e)
.sumber
Jika Anda tidak tahu jenis / asal kesalahan, Anda dapat mencoba:
Namun perlu diperhatikan, Anda akan mendapatkan peringatan:
sumber
Untuk memeriksa pesan kesalahan dan melakukan sesuatu dengannya (dengan Python 3) ...
sumber