精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

漲知識!Python 的異常信息還能這樣展現

開發 后端
在日常開發的過程中,當代碼報錯時,我們通常要不斷打印、閱讀traceback提示信息,來調試代碼,這篇文章介紹了如何實現一個Exception Hooks,使得traceback模塊的提示信息更加精確;同時還介紹了一些第三方庫,這些庫也提供了Exception Hooks的功能。

簡介

在日常開發中,我們的大部分時間都會花在閱讀traceback模塊信息以及調試代碼上。本文我們將改進traceback模塊,讓其中的提示信息更加簡潔準確。

基于這一目的,我們將會自定義Exception Hooks(異常處理鉤子),用來去除traceback中的冗余信息,只留下解決報錯所需的內容。此外,我還會介紹一些好用的第三方庫,你可以直接使用其中的Exception Hooks,來簡化traceback模塊。

Exception Hooks

假如程序的異常信息沒有被try/catch捕獲到,python解釋器就會調用sys.excepthook()函數,它會接收3個參數,分別是:type, value, traceback。這個函數也被稱為Exception Hook,會輸出程序的異常信息。

我們來看看下面這個例子:

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

在這個例子中,我們可以從traceback (tb)對象中獲取到異常信息出現的位置,位置信息包括:文件名(f_code.co_filename),函數/模塊名(f_code.co_name), 和行數(tb_lineno)。此外,我們可以使用exc_type和exc_value變量來獲取異常信息的內容。

當我們調用一個會產生錯誤的函數時,exception_hook會輸出如下內容:

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

上述例子提供了一部分異常信息,但要想獲取調試代碼所需的全部信息,并知道異常出現的時間及位置,我們還需要深入研究下traceback對象:

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'}

由上面的例子可以看出,traceback對象(tb)本質上是一個鏈表 - 存儲著所有出現的exceptions。因此可以使用tb_next對tb進行遍歷,并打印每一個異常的信息。在此基礎上,還可以使用tb_frame.f_locals屬性將變量輸出到console中,這有助于調試代碼。

使用traceback對象輸出異常信息是可行的,但是比較麻煩,此外輸出的信息可讀性較差。更方便的做法是使用traceback模塊,該模塊內置了許多提取異常信息的輔助函數。

目前我們已經介紹了Exception Hooks的基礎知識,接下來我們可以自定義一個exception hooks,并加入一些實用的特性。

自定義Exception Hooks

  1. 我們還可以讓異常信息自動存入文件中,在之后調試代碼的時候查看:
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")
  1. 異常信息默認會存儲到stderr中,如果你想改變存儲位置,可以這樣做:
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
  1. 我們還可以給提示信息的某一部分設置顏色:
# 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}")

除了上面介紹的例子,你還可以輸出每一幀的局部變量,或者找到出現異常的行中所引用的變量。這些Exception Hooks已經很成熟了,相比于自定義Exception hooks,我建議你閱讀下其他開發者的源碼,學習下他們的設計思路。

  •  輸出每一幀的局部變量[1]
  •  找到出現異常的行中所引用的變量[2]

第三方庫中的Exception Hooks

自定義一個Exception Hook很有趣,但許多第三方庫已經實現這一功能了。與其自己造輪子,不如看看其他優秀的工具。

  1. 首先,我個人最喜歡的是Rich,可以直接用pip進行安裝,隨后導入使用。如果你只想在一個例子中使用,可以這樣做: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

  1. better_exceptions也很受歡迎,我們需要先設置環境變量BETTER_EXCEPTIONS=1,再用pip安裝。此外,如果你的TERM變量不是xterm,還要把SUPPORTS_COLOR設置為True。
# 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

  1. 使用最方便的庫是pretty_errors,只需導入即可:
# 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()

除了直接導入外,上面的代碼還顯示了該庫的一些可選配置。更多的配置可以查看這里:配置[3]

  1. IPython的ultratb模塊
# 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()

  1. stackprinter庫
# https://github.com/cknd/stackprinter
# pip install stackprinter
import stackprinter
stackprinter.set_excepthook(style='darkbg2')
do_stuff()

結論

本文我們學習了如何自定義Exception Hooks,但我更推薦使用第三方庫。你可以在本文介紹的第三方庫中任選一個喜歡的,用到項目中。需要注意的是使用自定義Exception Hooks可能會丟失某些關鍵信息,例如:本文中的某些例子中,輸出中缺少文件路徑,在遠程調試代碼這無疑很不方便,因此,需要謹慎使用。

責任編輯:龐桂玉 來源: Python頭條
相關推薦

2024-07-10 11:26:18

2019-01-29 10:00:59

GitHub開源搜索

2024-05-17 09:37:26

format屬性Spring

2020-10-12 06:28:05

動態IP框架

2018-01-22 10:52:43

前端CSS追蹤用戶

2023-12-29 08:17:20

接口類SpringAOP

2020-11-16 13:38:31

PostMessage

2021-09-05 07:55:37

前端Emoji 表情

2021-10-29 07:49:22

Spring事務管理

2021-07-28 06:10:47

拖拽設計器 transmat

2021-10-11 08:08:02

Python異常程序

2012-07-13 11:32:16

網絡出口

2020-09-14 11:26:54

BinlogCanal數據庫

2024-08-02 08:38:20

Controller接口地址

2021-03-02 10:50:23

SpringMVC 參數JavaWeb

2019-12-05 10:08:39

Python 開發編程語言

2017-12-07 14:21:57

存儲方式變遷

2024-05-13 00:47:37

JSON對象數據

2025-11-24 09:01:03

Flink內存模型

2015-04-27 10:51:09

點贊
收藏

51CTO技術棧公眾號

国产色婷婷国产综合在线理论片a| 日韩久久免费电影| 女女百合国产免费网站| 99久久免费国产精精品| 国产毛片久久| 最近2019年好看中文字幕视频| 亚洲精品无码久久久久久久| 超碰激情在线| 中文字幕在线视频一区| 国产精品一区二区免费| 黄色一区二区视频| 99精品国产在热久久婷婷| 日韩专区在线观看| 日本japanese极品少妇| 成人在线视频国产| 日本电影亚洲天堂一区| 国内少妇毛片视频| 在线a人片免费观看视频| 成人av在线影院| 国产中文字幕91| 国产一级免费视频| 亚洲特色特黄| 国产一区二区黑人欧美xxxx| 大尺度在线观看| 亚洲精品成人一区| 色8久久人人97超碰香蕉987| 青青草视频国产| 欧美成年黄网站色视频| 久久久久久久一区| 国产乱子伦精品| 国产国语亲子伦亲子| 日韩激情视频网站| 欧洲一区二区视频| 国产稀缺真实呦乱在线| 亚洲国产精品91| 日韩有码在线电影| 久久视频精品在线观看| 亚洲资源网你懂的| 亚洲成人网av| 国产av一区二区三区传媒| 亚洲黑人在线| 777奇米四色成人影色区| www.涩涩涩| 欧洲av一区二区| 欧美性极品少妇精品网站| 男人的天堂狠狠干| 成人免费高清观看| 亚洲福利视频一区| 日本精品福利视频| а√中文在线8| 亚洲欧美日韩久久精品| 26uuu成人| 3d玉蒲团在线观看| 一区二区三区不卡在线观看| 在线视频一二三区| 黄色在线免费看| 亚洲视频一区二区在线| 国产女人18毛片| 91麻豆一二三四在线| 亚洲欧美日韩国产综合| 久久久久久久久网| 白白色在线观看| 亚洲va在线va天堂| 日韩在线一级片| 三上悠亚激情av一区二区三区| 色综合一区二区三区| 国产视频一区二区视频| 69堂免费精品视频在线播放| 欧美亚一区二区| 欧美日韩精品区别| 91成人精品在线| 亚洲精品国产精品国自产观看浪潮| 国产又黄又粗又猛又爽的视频 | 精品日产卡一卡二卡麻豆| 色诱av手机版| 天天操综合520| 亚洲最新在线视频| 日韩在线一卡二卡| 亚洲视频免费| 国产极品精品在线观看| 国产欧美熟妇另类久久久| 成人综合在线观看| 欧美日韩三区四区| 免费在线观看av片| 精品久久久久久久久久久久| 日日碰狠狠丁香久燥| 欧美天堂一区二区| 亚洲成人激情在线观看| 好吊视频在线观看| 久久久久久久久久久久久久久久久久 | 欧美一区二区三区久久精品茉莉花| 欧美大片免费观看在线观看网站推荐| 国产成人亚洲欧洲在线| 看片网站欧美日韩| 国产精品9999久久久久仙踪林| 欧美伦理影视网| 亚洲卡通欧美制服中文| 国产性xxxx18免费观看视频| 玖玖精品一区| 亚洲天堂网在线观看| 农村黄色一级片| 久久综合伊人| 国产精品毛片一区视频| 二区在线视频| 精品国产91久久久| 超碰91在线播放| 久久99青青| 久久理论片午夜琪琪电影网| 亚洲视频久久久| 99re在线视频这里只有精品| 伊人久久99| 免费观看成人性生生活片| 精品少妇一区二区| 在线日韩国产网站| 视频一区中文字幕| 国精产品一区二区| 午夜小视频在线观看| 欧美日韩在线观看一区二区| 人妻丰满熟妇av无码久久洗澡| 亚洲高清影视| 国产精品综合不卡av| 青青草在线视频免费观看| 一区二区三区免费看视频| 色噜噜狠狠一区二区| 国产欧美日韩视频在线| 国产69精品久久久久久| 丰满肥臀噗嗤啊x99av| 亚洲人成电影网站色mp4| 亚洲欧美久久久久| 超碰成人久久| 日韩免费在线免费观看| 亚洲av激情无码专区在线播放| 一区二区日韩av| 一级片免费在线观看视频| 99久久99视频只有精品| 国产日韩精品视频| av黄色在线观看| 欧美日韩亚洲综合一区二区三区 | www.av黄色| 亚洲私人影院在线观看| gogogo高清免费观看在线视频| 精品国产一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 亚州av在线播放| 大桥未久av一区二区三区| 成人性生活免费看| 免费在线成人| 日本午夜精品一区二区| 成人免费看黄| 国产午夜精品免费一区二区三区 | 在线免费日韩av| 黄页网站大全一区二区| 日本一区二区三区四区五区六区| 国产区一区二| 欧美精品精品精品精品免费| 免费看av毛片| 色综合一区二区| 日韩视频在线观看免费视频| 蜜臀久久久99精品久久久久久| 在线观看成人av| 亚洲精品视频一二三区| 午夜精品蜜臀一区二区三区免费| 天堂在线观看免费视频| 色综合一个色综合| 精品国产成人亚洲午夜福利| 日本在线播放一区二区三区| 天堂av免费看| 国产精品对白久久久久粗| 奇米4444一区二区三区| 永久免费av片在线观看全网站| 91精品国产综合久久久久久久久久| 国产极品国产极品| av毛片久久久久**hd| 美女网站免费观看视频| 婷婷综合社区| 国产欧美一区二区三区另类精品| 国产精品av一区二区三区| 伊人久久大香线蕉av一区二区| 国产精品呻吟久久| 午夜精品一区在线观看| 波多野结衣一二三四区| 成人小视频在线观看| 日韩精品一区二区三区色欲av| 欧美aaaa视频| 国产欧美日韩亚洲| 欧美a一级片| 午夜精品久久久久久久99热浪潮| 国产粉嫩一区二区三区在线观看 | 在线观看亚洲免费视频| 日韩激情av在线| www.av91| 日韩欧美三级| 国偷自产av一区二区三区小尤奈| av在线不卡精品| 欧美精品激情在线| 日本免费视频在线观看| 精品亚洲男同gayvideo网站| 中文字幕乱码人妻无码久久 | 成人av网站在线播放| 亚洲欧洲色图综合| 美国黄色a级片| 国产成人啪免费观看软件| 国产免费999| 亚洲无吗在线| 男人天堂成人网| 成人免费看片39| 蜜桃久久精品乱码一区二区 | 亚洲第一av网| 97超碰人人草| 欧亚一区二区三区| 成人精品在线看| 亚洲黄色性网站| 任我爽在线视频| 久久精品在线观看| 亚洲熟女乱综合一区二区三区| 国产一区二区在线视频| 中文字幕国产传媒| 亚洲高清毛片| 少妇久久久久久被弄到高潮| 欧美疯狂party性派对| 欧美日韩精品一区| 琪琪久久久久日韩精品| 国产精品美女黄网| 18国产精品| 亚洲伊人久久综合| 91精品福利观看| 国产精品自拍偷拍视频| 丰满少妇一区| 国产成人综合av| 欧美人体一区二区三区| 欧美亚洲一级片| 性爽视频在线| 2018中文字幕一区二区三区| gogogogo高清视频在线| 日韩视频在线观看免费| 91吃瓜网在线观看| 最近更新的2019中文字幕| www.中文字幕久久久| 国产一区二区三区三区在线观看| 三级在线播放| 亚洲欧美三级在线| 免费毛片在线| 国产亚洲精品一区二555| 欧美成熟毛茸茸| 亚洲欧美国产一区二区三区| 欧美孕妇孕交| 在线观看精品自拍私拍| 免费高清完整在线观看| 久久精品国产欧美激情| 黄色免费在线看| 欧美精品在线播放| 99色在线观看| 啪一啪鲁一鲁2019在线视频| 日韩不卡免费高清视频| 国产精品亚洲精品| 国产精品1区| 高清国产一区| 欧美日韩直播| 日本免费高清一区二区| 日韩精品永久网址| 成人免费看片视频在线观看| 欧美日韩亚洲一区在线观看| 青青青在线视频播放| 国产一区91| 色悠悠久久综合网| 国产毛片精品国产一区二区三区| 免费黄视频在线观看| 91视频免费看| 欧美日韩国产一二三区| 一区二区在线免费观看| 青青草成人av| 欧美日韩亚洲高清一区二区| 国产乱子伦精品无码码专区| 欧美精品一区二区在线播放| 免费黄网站在线观看| 韩剧1988在线观看免费完整版| 椎名由奈jux491在线播放| 电影91久久久| 国产精品日韩一区二区三区| 色婷婷综合久久久久久| 亚洲精品日韩精品| 欧美成人69| 黄色片视频在线播放| 九九九久久久精品| 亚洲午夜久久久久久久久| 久久精品综合网| 欧美三级免费看| 色婷婷久久99综合精品jk白丝| 中文字幕免费高清在线观看| 欧美刺激午夜性久久久久久久| 亚洲av成人精品毛片| 日韩亚洲精品电影| а√在线天堂官网| 成人av.网址在线网站| 久久综合五月婷婷| 一区二区三视频| 国产精品人人爽人人做我的可爱| 午夜免费看毛片| 94色蜜桃网一区二区三区| 国产福利视频网站| 色婷婷狠狠综合| 蜜臀久久精品久久久久| 一区二区国产精品视频| 丁香花在线电影| 国产精品爽黄69| 日日狠狠久久偷偷综合色| 欧美日韩国产一区在线| 国产成人无码精品久在线观看| 欧美中文一区二区三区| 天堂在线视频免费观看| 久久在线视频在线| 日本一区二区三区视频在线| 国产一区二区无遮挡| 91精品国产91久久久久久密臀| 国产熟女高潮视频| eeuss鲁片一区二区三区在线观看| 天天色天天综合| 欧美影院一区二区| 天堂av在线资源| 久久久亚洲国产天美传媒修理工| 欧美jizz18| 亚洲激情一区二区| 玖玖精品视频| 国产三级视频网站| 五月激情综合网| 丰满熟妇乱又伦| 美女精品视频一区| 综合久草视频| 伊人久久av导航| 久久se这里有精品| 国产美女网站视频| 欧美少妇xxx| 波多野结衣在线网站| 日韩av男人的天堂| 国产日产精品一区二区三区四区的观看方式| 日韩xxxx视频| a亚洲天堂av| 国产性xxxx高清| 亚洲国产私拍精品国模在线观看| 欧美黑人猛交| 国产99在线免费| 激情久久一区| 亚洲高清无码久久| 激情成人中文字幕| 视频国产一区二区三区| 欧美孕妇孕交黑巨大网站| 九九热精品视频在线观看| 中国丰满人妻videoshd| 91麻豆国产福利在线观看| 国产一级精品视频| 亚洲欧美国产一本综合首页| 成人天堂yy6080亚洲高清| 日韩欧美99| 麻豆一区二区在线| 我要看黄色一级片| 日韩一区二区不卡| 人人澡人人添人人爽一区二区| 国产精品国模大尺度私拍| 影音先锋中文字幕一区| 国产麻豆天美果冻无码视频 | 亚洲精品久久久久久久久久久久| 国产精品一品| 农村寡妇一区二区三区| 老司机精品久久| 一区二区三区在线播放视频| 91精品国产麻豆国产自产在线| 性爱视频在线播放| 久久久99国产精品免费| 石原莉奈在线亚洲二区| 国产一区二区三区视频播放| 91麻豆精品国产91久久久久久 | 国产不卡在线观看| 色综合咪咪久久网| 久久久久久久久久久久国产精品| 性做久久久久久久免费看| 青春有你2免费观看完整版在线播放高清 | 亚洲视频免费一区| 青娱乐极品盛宴一区二区| 青青视频免费在线观看| 91首页免费视频| 一级黄色片网站| 国内偷自视频区视频综合| 欧美亚洲激情| 国产无套精品一区二区三区| 色婷婷国产精品久久包臀| 看女生喷水的网站在线观看| 国产一区二区视频在线免费观看| 日韩av在线播放中文字幕| 欧美毛片在线观看| 亚洲美女精品久久| 精品网站999| 日韩中文字幕组| 亚洲在线免费播放| 日本暖暖在线视频| 久久人人九九| 国产精品一级二级三级| 日韩在线播放中文字幕| 欧美福利视频网站| 成人在线电影在线观看视频| 国产日韩视频一区|