Saya telah melihat banyak posting tentang jejak stack dan pengecualian dalam Python. Tetapi belum menemukan apa yang saya butuhkan.
Saya memiliki sepotong kode Python 2.7 yang dapat menimbulkan pengecualian. Saya ingin menangkapnya dan menetapkan ke string deskripsi lengkap dan jejak stack yang menyebabkan kesalahan (cukup semua yang kita gunakan untuk melihat di konsol). Saya perlu string ini untuk mencetaknya ke kotak teks di GUI.
Sesuatu seperti ini:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
Masalahnya adalah: apa fungsinya complete_exception_description
?
python
python-2.7
exception-handling
stack-trace
kebiruan
sumber
sumber
log_error(err)
fungsi.Mari kita membuat stacktrace yang cukup rumit, untuk menunjukkan bahwa kita mendapatkan stacktrace lengkap:
Logout stacktrace penuh
Praktik terbaik adalah membuat logger diatur untuk modul Anda. Ia akan mengetahui nama modul dan dapat mengubah level (di antara atribut lainnya, seperti penangan)
Dan kita bisa menggunakan logger ini untuk mendapatkan kesalahan:
Log mana:
Jadi kami mendapatkan output yang sama seperti ketika kami memiliki kesalahan:
Hanya mendapatkan string
Jika Anda benar-benar hanya menginginkan string, gunakan
traceback.format_exc
fungsinya sebagai gantinya, menunjukkan pendataan string di sini:Log mana:
sumber
except Exception as e: logger.exception("<<clearly and distinctly describe what failed here>>", exc_info=e)
exc_info
argumen mengharapkan "tuple pengecualian" sedangkanerror
turunan dariException
objek (atau subkelas), dan tidak perlu diubaherror
kee
.Dengan Python 3, kode berikut akan memformat
Exception
objek persis seperti yang akan diperoleh menggunakantraceback.format_exc()
:Keuntungannya adalah bahwa hanya
Exception
objek yang diperlukan (berkat__traceback__
atribut yang direkam ), dan karenanya dapat lebih mudah diteruskan sebagai argumen ke fungsi lain untuk diproses lebih lanjut.sumber
.__traceback__
dantype
, lihat stackoverflow.com/a/58764987/5717886Anda menggunakan sys.exc_info () untuk mengumpulkan informasi dan fungsi-fungsi dalam
traceback
modul untuk memformatnya. Berikut adalah beberapa contoh untuk memformatnya.Seluruh string pengecualian ada di:
sumber
Bagi yang menggunakan Python-3
Menggunakan
traceback
modul danexception.__traceback__
seseorang dapat mengekstrak tumpukan-jejak sebagai berikut:traceback.extract_stack()
__traceback__
dari objek pengecualian menggunakantraceback.extract_tb()
traceback.format_list()
Peragaan sederhana:
Kami mendapatkan output berikut saat kami menelepon
bar()
:sumber
Anda juga dapat mempertimbangkan untuk menggunakan modul Python bawaan , cgitb , untuk mendapatkan informasi pengecualian yang benar-benar bagus, diformat dengan baik termasuk nilai variabel lokal, konteks kode sumber, parameter fungsi dll.
Misalnya untuk kode ini ...
kami mendapatkan output pengecualian ini ...
sumber
Jika Anda ingin mendapatkan informasi yang sama ketika pengecualian tidak ditangani, Anda dapat melakukan sesuatu seperti ini. Lakukan
import traceback
dan kemudian:Saya menggunakan Python 3.7.
sumber
Untuk Python 3.5+ :
Jadi, Anda bisa mendapatkan stacktrace dari pengecualian Anda dari pengecualian lainnya. Gunakan
traceback.TracebackException
untuk itu (ganti sajaex
dengan pengecualian Anda):Contoh yang diperluas dan fitur lain untuk melakukan ini:
Outputnya akan seperti ini:
sumber
2-sen saya:
sumber
Jika tujuan Anda adalah membuat pesan pengecualian dan stacktrace terlihat persis seperti ketika python melakukan kesalahan, berikut ini berfungsi di kedua python 2 + 3:
Ini bekerja dengan menghapus
format_stacktrace()
panggilan terakhir dari tumpukan dan bergabung dengan yang lainnya. Saat dijalankan, contoh di atas memberikan output berikut:sumber
Saya mendefinisikan kelas pembantu berikut:
Yang nantinya bisa saya gunakan seperti ini:
Dan nantinya bisa mengkonsumsinya seperti ini:
(Latar belakang: Saya frustasi karena menggunakan
Promise
s bersama denganException
s, yang sayangnya melewati pengecualian yang muncul di satu tempat ke penangan on_rejected di tempat lain, dan karenanya sulit untuk mendapatkan traceback dari lokasi asli)sumber