Jadual Kandungan
Cangkuk Pengecualian Tersuai
Cangkuk Pengecualian dalam perpustakaan pihak ketiga
Rumah pembangunan bahagian belakang Tutorial Python Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

Apr 11, 2023 pm 04:40 PM
python kod Maklumat pengecualian

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

Pengenalan

Dalam pembangunan harian, kebanyakan masa kita dihabiskan untuk membaca maklumat modul surih balik dan kod nyahpepijat. Dalam artikel ini, kami akan menambah baik modul jejak balik untuk menjadikan maklumat segera lebih ringkas dan tepat.

Berdasarkan tujuan ini, kami akan menyesuaikan Cangkuk Pengecualian (cangkuk pengendalian pengecualian) untuk mengalih keluar maklumat berlebihan dalam surih, hanya meninggalkan kandungan yang diperlukan untuk menyelesaikan ralat. Selain itu, saya juga akan memperkenalkan beberapa perpustakaan pihak ketiga yang berguna, dan anda boleh terus menggunakan Cangkuk Pengecualian di dalamnya untuk memudahkan modul jejak balik.

Cangkuk Pengecualian

Jika maklumat pengecualian program tidak ditangkap melalui try/catch, penterjemah python akan memanggil fungsi sys.excepthook(), yang akan menerima 3 parameter, masing-masing: jenis, nilai, jejak balik. Fungsi ini juga dipanggil Exception Hook dan akan mengeluarkan maklumat pengecualian program.

Mari kita lihat contoh berikut:

import sys
def exception_hook(exc_type, exc_value, tb):
 print('Traceback:')
 filename = tb.tb_frame.f_code.co_filename
 name = tb.tb_frame.f_code.co_name
 line_no = tb.tb_lineno
 print(f"File {filename} line {line_no}, in {name}")
 # Exception type 和 value
 print(f"{exc_type.__name__}, Message: {exc_value}")
sys.excepthook = exception_hook
Salin selepas log masuk

Dalam contoh ini, kita boleh mendapatkan maklumat lokasi dan lokasi daripada objek jejak balik (tb). nama (f_code.co_filename), nama fungsi/modul (f_code.co_name), dan nombor baris (tb_lineno). Selain itu, kita boleh menggunakan pembolehubah exc_type dan exc_value untuk mendapatkan kandungan maklumat pengecualian.

Apabila kita memanggil fungsi yang menghasilkan ralat, exception_hook akan mengeluarkan kandungan berikut:

def do_stuff():
 # 写一段会产生异常的代码
 raise ValueError("Some error message")
do_stuff()
# Traceback:
# File /home/some/path/exception_hooks.py line 22, in <module>
# ValueError, Message: Some error message
Salin selepas log masuk

Contoh di atas menyediakan sebahagian daripada maklumat pengecualian, tetapi untuk mendapatkan kod penyahpepijatan, Semua maklumat yang diperlukan, dan untuk mengetahui masa dan lokasi pengecualian, kita juga perlu mengkaji objek jejak balik secara mendalam:

def exception_hook(exc_type, exc_value, tb):
 local_vars = {}
 while tb:
 filename = tb.tb_frame.f_code.co_filename
 name = tb.tb_frame.f_code.co_name
 line_no = tb.tb_lineno
 print(f"File {filename} line {line_no}, in {name}")
 local_vars = tb.tb_frame.f_locals
 tb = tb.tb_next
 print(f"Local variables in top frame: {local_vars}")
...
# File /home/some/path/exception_hooks.py line 41, in <module>
# File /home/some/path/exception_hooks.py line 7, in do_stuff
# Local variables in top frame: {'some_var': 'data'}
Salin selepas log masuk

Seperti yang dapat dilihat daripada contoh di atas, objek jejak balik (tb) pada asasnya ialah senarai terpaut - Menyimpan semua pengecualian yang berlaku. Oleh itu, anda boleh menggunakan tb_next untuk melintasi tb dan mencetak maklumat setiap pengecualian. Atas dasar ini, anda juga boleh menggunakan atribut tb_frame.f_locals kepada pembolehubah output ke konsol, yang membantu menyahpepijat kod.

Adalah boleh menggunakan objek surih untuk mengeluarkan maklumat pengecualian, tetapi ia lebih menyusahkan Selain itu, maklumat output kurang boleh dibaca. Pendekatan yang lebih mudah ialah menggunakan modul jejak balik, yang mempunyai banyak fungsi tambahan terbina dalam untuk mengekstrak maklumat pengecualian.

Kini kami telah memperkenalkan pengetahuan asas Cangkuk Pengecualian Seterusnya, kami boleh menyesuaikan cangkuk pengecualian dan menambah beberapa ciri praktikal.

Cangkuk Pengecualian Tersuai

  1. Kami juga boleh menyimpan maklumat pengecualian secara automatik dalam fail dan melihatnya kemudian apabila menyahpepijat kod:
LOG_FILE_PATH = "./some.log"
FILE = open(LOG_FILE_PATH, mode="w")
def exception_hook(exc_type, exc_value, tb):
 FILE.write("*** Exception: ***n")
 traceback.print_exc(file=FILE)
 FILE.write("n*** Traceback: ***n")
 traceback.print_tb(tb, file=FILE)
# *** Exception: ***
# NoneType: None
#
# *** Traceback: ***
# File "/home/some/path/exception_hooks.py", line 82, in <module>
# do_stuff()
# File "/home/some/path/exception_hooks.py", line 7, in do_stuff
# raise ValueError("Some error message")
Salin selepas log masuk
  1. Maklumat pengecualian akan disimpan dalam stderr secara lalai Jika anda ingin menukar lokasi storan, anda boleh melakukan ini:
import logging
logging.basicConfig(
 level=logging.CRITICAL,
 format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
 datefmt='%H:%M:%S',
 stream=sys.stdout
)
def exception_hook(exc_type, exc_value, exc_traceback):
 logging.critical("Uncaught exception:", exc_info=(exc_type, exc_value, exc_traceback))
# [17:28:33] {/home/some/path/exception_hooks.py:117} CRITICAL - Uncaught exception:
# Traceback (most recent call last):
# File "/home/some/path/exception_hooks.py", line 122, in <module>
# do_stuff()
# File "/home/some/path/exception_hooks.py", line 7, in do_stuff
# raise ValueError("Some error message")
# ValueError: Some error message
Salin selepas log masuk
  1. Kami. juga boleh memberi gesaan Tetapkan warna bahagian tertentu maklumat:
# pip install colorama
from colorama import init, Fore
init(autoreset=True)# Reset the color after every print
def exception_hook(exc_type, exc_value, tb):
 local_vars = {}
 while tb:
 filename = tb.tb_frame.f_code.co_filename
 name = tb.tb_frame.f_code.co_name
 line_no = tb.tb_lineno
 # Prepend desired color (e.g. RED) to line
 print(f"{Fore.RED}File {filename} line {line_no}, in {name}")
 local_vars = tb.tb_frame.f_locals
 tb = tb.tb_next
 print(f"{Fore.GREEN}Local variables in top frame: {local_vars}")
Salin selepas log masuk

Selain contoh yang diperkenalkan di atas, anda juga boleh mengeluarkan pembolehubah setempat bagi setiap bingkai atau cari pembolehubah dirujuk dalam baris di mana pengecualian berlaku. Cangkuk Pengecualian ini sudah sangat matang Berbanding dengan cangkuk Pengecualian tersuai, saya cadangkan anda membaca kod sumber pembangun lain dan mempelajari idea reka bentuk mereka.

  • Keluarkan pembolehubah setempat bagi setiap bingkai [1]
  • Cari pembolehubah yang dirujuk dalam baris di mana pengecualian berlaku [2]

Cangkuk Pengecualian dalam perpustakaan pihak ketiga

Memang menarik untuk menyesuaikan Cangkuk Pengecualian, tetapi banyak perpustakaan pihak ketiga telah melaksanakan fungsi ini. Daripada mencipta semula roda, lihat alat hebat yang lain.

  1. Pertama sekali, kegemaran peribadi saya ialah Kaya, yang boleh dipasang terus dengan pip dan kemudian diimport untuk digunakan. Jika anda hanya mahu menggunakannya dalam satu contoh, anda boleh melakukan ini: python -m rich.traceback
# https://rich.readthedocs.io/en/latest/traceback.html
# pip install rich
# python -m rich.traceback
from rich.traceback import install
install(show_locals=True)
do_stuff()# Raises ValueError
Salin selepas log masuk

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

  1. better_exceptions juga popular , Kita perlu menetapkan pembolehubah persekitaran BETTER_EXCEPTIONS=1 dahulu, dan kemudian memasangnya dengan pip. Selain itu, jika pembolehubah TERM anda bukan xterm, tetapkan SUPPORTS_COLOR kepada Benar.
# https://github.com/Qix-/better-exceptions
# pip install better_exceptions
# export BETTER_EXCEPTIONS=1
import better_exceptions
better_exceptions.MAX_LENGTH = None
# 检查你的 TERM 变量是否被设置为 `xterm`, 如果没有执行以下操作
# See issue: https://github.com/Qix-/better-exceptions/issues/8
better_exceptions.SUPPORTS_COLOR = True
better_exceptions.hook()
do_stuff()# Raises ValueError
Salin selepas log masuk

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

  1. Pustaka yang paling mudah digunakan ialah pretty_errors, hanya importnya:
# https://github.com/onelivesleft/PrettyErrors/
# pip install pretty_errors
import pretty_errors
# 如果你对默认配置满意的话,则无需修改
pretty_errors.configure(
 filename_display= pretty_errors.FILENAME_EXTENDED,
 line_number_first = True,
 display_link= True,
 line_color= pretty_errors.RED + '> ' + pretty_errors.default_config.line_color,
 code_color= '' + pretty_errors.default_config.line_color,
 truncate_code = True,
 display_locals= True
)
do_stuff()
Salin selepas log masuk

Dalam selain import langsung, kod di atas juga menunjukkan beberapa konfigurasi pilihan perpustakaan. Lebih banyak konfigurasi boleh dilihat di sini: Konfigurasi [3]

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

  1. Modul ultratb IPython
# https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.ultratb.html
# pip install ipython
import IPython.core.ultratb
# Also ColorTB, FormattedTB, ListTB, SyntaxTB
sys.excepthook = IPython.core.ultratb.VerboseTB(color_scheme='Linux')# Other colors: NoColor, LightBG, Neutral
do_stuff()
Salin selepas log masuk

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

  1. stackprinter库
# https://github.com/cknd/stackprinter
# pip install stackprinter
import stackprinter
stackprinter.set_excepthook(style='darkbg2')
do_stuff()
Salin selepas log masuk

Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini

结论

本文我们学习了如何自定义Exception Hooks,但我更推荐使用第三方库。你可以在本文介绍的第三方库中任选一个喜欢的,用到项目中。需要注意的是使用自定义Exception Hooks可能会丢失某些关键信息,例如:本文中的某些例子中,输出中缺少文件路径,在远程调试代码这无疑很不方便,因此,需要谨慎使用。

Atas ialah kandungan terperinci Tingkatkan pengetahuan anda! Maklumat pengecualian Python juga boleh dipaparkan seperti ini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP dan Python: Paradigma yang berbeza dijelaskan PHP dan Python: Paradigma yang berbeza dijelaskan Apr 18, 2025 am 12:26 AM

PHP terutamanya pengaturcaraan prosedur, tetapi juga menyokong pengaturcaraan berorientasikan objek (OOP); Python menyokong pelbagai paradigma, termasuk pengaturcaraan OOP, fungsional dan prosedur. PHP sesuai untuk pembangunan web, dan Python sesuai untuk pelbagai aplikasi seperti analisis data dan pembelajaran mesin.

Memilih antara php dan python: panduan Memilih antara php dan python: panduan Apr 18, 2025 am 12:24 AM

PHP sesuai untuk pembangunan web dan prototaip pesat, dan Python sesuai untuk sains data dan pembelajaran mesin. 1.Php digunakan untuk pembangunan web dinamik, dengan sintaks mudah dan sesuai untuk pembangunan pesat. 2. Python mempunyai sintaks ringkas, sesuai untuk pelbagai bidang, dan mempunyai ekosistem perpustakaan yang kuat.

Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Apr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Bolehkah kod studio visual digunakan dalam python Bolehkah kod studio visual digunakan dalam python Apr 15, 2025 pm 08:18 PM

Kod VS boleh digunakan untuk menulis Python dan menyediakan banyak ciri yang menjadikannya alat yang ideal untuk membangunkan aplikasi python. Ia membolehkan pengguna untuk: memasang sambungan python untuk mendapatkan fungsi seperti penyempurnaan kod, penonjolan sintaks, dan debugging. Gunakan debugger untuk mengesan kod langkah demi langkah, cari dan selesaikan kesilapan. Mengintegrasikan Git untuk Kawalan Versi. Gunakan alat pemformatan kod untuk mengekalkan konsistensi kod. Gunakan alat linting untuk melihat masalah yang berpotensi lebih awal.

Adakah sambungan vscode berniat jahat? Adakah sambungan vscode berniat jahat? Apr 15, 2025 pm 07:57 PM

Sambungan kod VS menimbulkan risiko yang berniat jahat, seperti menyembunyikan kod jahat, mengeksploitasi kelemahan, dan melancap sebagai sambungan yang sah. Kaedah untuk mengenal pasti sambungan yang berniat jahat termasuk: memeriksa penerbit, membaca komen, memeriksa kod, dan memasang dengan berhati -hati. Langkah -langkah keselamatan juga termasuk: kesedaran keselamatan, tabiat yang baik, kemas kini tetap dan perisian antivirus.

PHP dan Python: menyelam mendalam ke dalam sejarah mereka PHP dan Python: menyelam mendalam ke dalam sejarah mereka Apr 18, 2025 am 12:25 AM

PHP berasal pada tahun 1994 dan dibangunkan oleh Rasmuslerdorf. Ia pada asalnya digunakan untuk mengesan pelawat laman web dan secara beransur-ansur berkembang menjadi bahasa skrip sisi pelayan dan digunakan secara meluas dalam pembangunan web. Python telah dibangunkan oleh Guidovan Rossum pada akhir 1980 -an dan pertama kali dikeluarkan pada tahun 1991. Ia menekankan kebolehbacaan dan kesederhanaan kod, dan sesuai untuk pengkomputeran saintifik, analisis data dan bidang lain.

Boleh kod vs dijalankan di Windows 8 Boleh kod vs dijalankan di Windows 8 Apr 15, 2025 pm 07:24 PM

Kod VS boleh dijalankan pada Windows 8, tetapi pengalaman mungkin tidak hebat. Mula -mula pastikan sistem telah dikemas kini ke patch terkini, kemudian muat turun pakej pemasangan kod VS yang sepadan dengan seni bina sistem dan pasangnya seperti yang diminta. Selepas pemasangan, sedar bahawa beberapa sambungan mungkin tidak sesuai dengan Windows 8 dan perlu mencari sambungan alternatif atau menggunakan sistem Windows yang lebih baru dalam mesin maya. Pasang sambungan yang diperlukan untuk memeriksa sama ada ia berfungsi dengan betul. Walaupun kod VS boleh dilaksanakan pada Windows 8, disyorkan untuk menaik taraf ke sistem Windows yang lebih baru untuk pengalaman dan keselamatan pembangunan yang lebih baik.

Cara menjalankan program di terminal vscode Cara menjalankan program di terminal vscode Apr 15, 2025 pm 06:42 PM

Dalam kod VS, anda boleh menjalankan program di terminal melalui langkah -langkah berikut: Sediakan kod dan buka terminal bersepadu untuk memastikan bahawa direktori kod selaras dengan direktori kerja terminal. Pilih arahan Run mengikut bahasa pengaturcaraan (seperti python python your_file_name.py) untuk memeriksa sama ada ia berjalan dengan jayanya dan menyelesaikan kesilapan. Gunakan debugger untuk meningkatkan kecekapan debug.

See all articles