Saya ingin menyimpan nama kesalahan dan detail pelacakan kembali ke dalam variabel. Ini usahaku.
import sys
try:
try:
print x
except Exception, ex:
raise NameError
except Exception, er:
print "0", sys.exc_info()[0]
print "1", sys.exc_info()[1]
print "2", sys.exc_info()[2]
Keluaran:
0 <type 'exceptions.NameError'>
1
2 <traceback object at 0xbd5fc8>
Output yang diinginkan:
0 NameError
1
2 Traceback (most recent call last):
File "exception.py", line 6, in <module>
raise NameError
PS Saya tahu ini dapat dilakukan dengan mudah menggunakan modul traceback, tetapi saya ingin mengetahui penggunaan objek sys.exc_info () [2] di sini.
python
exception-handling
codersofthedark
sumber
sumber
<python install path>/Lib/traceback.py
) untuk info lebih lanjut.Jawaban:
Inilah cara saya melakukannya:
Namun Anda harus melihat dokumentasi traceback , karena Anda mungkin menemukan metode yang lebih cocok, tergantung bagaimana Anda ingin memproses variabel Anda setelahnya ...
sumber
sys.exc_info()[2].tb_frame.f_code.co_names[3]
, tetapi sama sekali tidak masuk akal ... Jika ada modul yang dipanggiltraceback
di pustaka standar, ada alasan untuk itu ... :)traceback.format_exception(*sys.exc_info())
adalah cara untuk melakukannya. Tapi itu secara fungsional setara dengantraceback.format_exc()
.sys.exc_info () mengembalikan tupel dengan tiga nilai (tipe, nilai, traceback).
Sebagai Contoh, Dalam program berikut
Sekarang Jika kita mencetak tupel nilainya akan menjadi ini.
Detail di atas juga dapat diambil hanya dengan mencetak pengecualian dalam format string.
sumber
Gunakan
traceback.extract_stack()
jika Anda ingin akses mudah ke nama modul dan fungsi serta nomor baris.Gunakan
''.join(traceback.format_stack())
jika Anda hanya menginginkan string yang terlihat sepertitraceback.print_stack()
output.Perhatikan bahwa bahkan dengan
''.join()
Anda akan mendapatkan string multi-baris, karena elemenformat_stack()
berisi\n
. Lihat keluaran di bawah.Ingatlah untuk
import traceback
.Berikut keluaran dari
traceback.extract_stack()
. Pemformatan ditambahkan agar mudah dibaca.Berikut keluaran dari
''.join(traceback.format_stack())
. Pemformatan ditambahkan agar mudah dibaca.sumber
Berhati-hatilah saat Anda mengambil objek pengecualian atau objek pelacakan balik dari pengendali pengecualian, karena ini menyebabkan referensi melingkar dan
gc.collect()
akan gagal dikumpulkan. Ini tampaknya menjadi masalah khusus di lingkungan notebook ipython / jupyter di mana objek traceback tidak dibersihkan pada waktu yang tepat dan bahkan panggilan eksplisit kegc.collect()
dalamfinally
bagian tidak melakukan apa pun. Dan itu masalah besar jika Anda memiliki beberapa objek besar yang tidak mendapatkan memori mereka kembali karena itu (misalnya CUDA keluar dari pengecualian memori yang tanpa solusi ini memerlukan kernel restart lengkap untuk memulihkan).Secara umum, jika Anda ingin menyimpan objek traceback, Anda perlu menghapusnya dari referensi ke
locals()
, seperti:Dalam kasus notebook jupyter, Anda harus melakukannya setidaknya di dalam penangan pengecualian:
Diuji dengan python 3.7.
ps masalah dengan ipython atau jupyter notebook env adalah bahwa ia memiliki
%tb
sihir yang menyimpan traceback dan membuatnya tersedia kapan saja nanti. Dan sebagai hasilnya,locals()
semua frame yang berpartisipasi dalam traceback tidak akan dibebaskan hingga notebook keluar atau pengecualian lain akan menimpa backtrace yang disimpan sebelumnya. Ini sangat bermasalah. Seharusnya tidak menyimpan traceback tanpa membersihkan bingkainya. Perbaikan dikirimkan di sini .sumber
Objek dapat digunakan sebagai parameter dalam
Exception.with_traceback()
fungsi:sumber