电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談python出錯時traceback的解讀

瀏覽:135日期:2022-07-17 13:17:42

寫 Python 代碼的時候,當代碼中出現錯誤,會在輸出的時候打印 Traceback 錯誤信息,很多初學者看到那一堆錯誤信息,往往都會處于懵逼狀態,腦中總會冒出一句,這都是些啥玩意。如果你是第一次看到它,也許你不知道它在告訴你什么。雖然 Python 的 Traceback 提示信息看著挺復雜,但是里面豐富的信息,可以幫助你診斷和修復代碼中引發異常的原因,以及定位到具體哪個文件的哪行代碼出現的錯誤,所以說學會看懂 Traceback 信息是非常重要的,另外在面試的時候也經常會問到 Python 中的異常類型及其含義,那么,接下來就讓我們對其進行詳細理解。

什么是 Traceback

Traceback 是 Python 錯誤信息的報告。在其他編程語言中有著不同的叫法包括 stack trace, stack traceback, backtrac 等名稱, 在 Python 中,我們使用的術語是 Traceback。后面我提到的錯誤信息等詞都表示Traceback。當你的程序導致異常時,Python 將打印 Traceback 以幫助你知道哪里出錯了。下面是一個例子來說明這種情況

# example.pydef greet(someone ): print(’Hello, ’ + someon ) greet(’Chad’)

這里首先定義了函數 greet,然后傳入參數 someone,然后函數內,一個 print 語句其中 someon 是一個沒有定義的變量,然后通過 greet (’Chad’),調用剛才定義的 greet 函數,運行之后會出現如下錯誤信息。

(Python 中的錯誤信息開頭就是 Traceback。)

Traceback (most recent call last ): File ’/Users/chenxiangan/pythonproject/demo/exmpale.py’, line 5, in <module> greet (’Chad’) File ’/Users/chenxiangan/pythonproject/demo/exmpale.py’, line 3, in greet print (’Hello, ’ + someon )NameError: name ’someon’ is not defined

此錯誤輸出包含診斷問題所需的所有信息。錯誤輸出的最后一行一般會告訴你引發了什么類型的異常,以及關于該異常的一些相關信息。錯誤信息的前幾行指出了引發異常的代碼文件以及行數。

在上面的錯誤信息中,異常類型是 NameError,意思是名稱使用了一個沒定義的名稱(變量、函數、類)的引用。在本例中,引用的名稱是 someon。

一般情況下看錯誤信息的最后一行就能定位到錯誤的原因。然后在代碼中搜索錯誤提示中的名稱’someon’,然后發現這是一個拼寫錯誤,然后我們改成 someone 即可。

然而,有些代碼的錯誤信息要比這個復雜的多。

如何閱讀 Python 的 Traceback 信息?

當你想確定代碼為什么引發異常的時侯,可以根據 Python 的 Traceback 獲取許多有用的信息。下面,將列舉一些常見的 Traceback,以便理解 Tracebac 中包含的不同信息。

Python Traceback 信息一覽

每個 Python 的 Traceback 信息都有幾個重要的部分。下圖顯示了各個組成部分:

藍框:Traceback 的最后一行為錯誤消息行。其中包含引發的異常名稱。 綠框:異常名稱后面是錯誤消息。此消息通常包含有用的信息,用于了解引發異常的原因。 黃色方框:閱讀順序由下而上,最下面的信息,是拋出錯誤的最外層的位置,越往上代碼調用深度越深。

然后每個出錯的文件會有兩條錯誤信息,第一行是 File 后面緊跟著文件的路徑,然后是行數,最后是模塊或者方法名。在 Pycharm 中點擊文件的鏈接即可定位到錯誤的位置。

紅色下劃線:第二行就是實際執行的代碼語句了。

一個具體的例子

通過一些特定的 Traceback 信息,可以幫助我們更好地理解并查看 Traceback 將提供什么信息。

通過下面的示例代碼來說明 Python 中 Traceback 所提供的信息

def who_to_greet(person ): return person if person else input (’Greet who? ’)def greet(someone, greeting=’Hello’): print(greeting + ’, ’ + who_to_greet (someone ))def greet_many(people): for person in people: try: greet(person ) except Exception: print (’hi, ’ + person )

定義一個 who_to_greet 函數,然后接受一個值 person,并根據 if 判斷返回相應結果。

然后,greet 函數接受一個 someone 和一個可選的 greeting,之后調用 print 函數,在 print 中調用 who_to_greet 函數并傳入參數 someone。

最后,greet_many(),將迭代 people 列表并調用 greet 函數。如果通過調用 greet()引發異常,則會打印一個簡單的問候語。

只要提供了正確的輸入,此代碼就沒有任何可能導致異常被引發的錯誤。

如果你在 greetings.py 中調用 greet 函數,并傳入值(例如 greet (’chad’,greting =’Yo’)),那么你將獲得以下 Traceback 信息

Traceback (most recent call last ): File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 17, in <module> greet (’chad’,greting =’Yo’)TypeError: greet () got an unexpected keyword argument ’greting’

之前我們說過閱讀 Python 的 Traceback 信息,是由下而上進行閱讀的,這里我們再一起看一看。

首先,我們需要看的是錯誤信息的最后一行,通過最后一行可以知道錯誤的類型以及一些錯誤原因。

意思是說:調用 greet()的時候使用了一個未知的參數,這個未知參數就是 greting。

好的,然后我們需要繼續向上看,可以看到導致異常的行。在這個例子中我們看到的是調用 greet 方法的具體代碼。

它的上一行提供了代碼所在文件的路徑,以及代碼文件的行號以及它所在的模塊。(Pycharm 中通過點擊文件鏈接可以定位到具體位置)

在這個例子中,因為我們的代碼沒有使用任何其他 Python 模塊,所以我們在這里看到<module>,它表示所處位置是在執行的文件。

使用不同的文件和不同的調用方式調用 greet 方法,得到的 Traceback 信息也是不同的,下面就通過文件導入的形式來執行 greet 方法。看看結果有什么區別吧

# example.py from greetings import greet greet (1)

運行之后的結果:

Traceback (most recent call last ): File ’/Users/chenxiangan/pythonproject/demo/exmpale.py’, line 3, in <module> greet (1) File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 6, in greet print (greeting + ’, ’ + who_to_greet (someone ))TypeError: can only concatenate str (not ’int’) to str

在本例中引發的異常同樣是一個類型錯誤,但這一次消息的幫助要小一些。它只是告訴你,在代碼的某個地方,字符串只能和字符串拼接,不能是 int。

向上移動,可以看到執行的代碼行。然后是文件和行號的代碼。不過,這一次我們得到的不是,而是正在執行的函數的名稱 greet()。

然后繼續往上看,一行執行的代碼,我們看到問題代碼是 greet()函數調用時傳入了一個整數。

有時在引發異常之后,另一部分代碼會捕獲該異常并導致異常。在這種情況下,Python 將按接收順序輸出所有異常信息,最外層的異常信息處于 Traceback 內容的最下面位置。

可能看起來有點懵,下面使用一個具體例子進行說明。

在 greetings.py 文件中調用 greet_many 方式具體調用代碼如下:

greet_many ([’Chad’, ’Dan’, 1])

運行之后輸出的錯誤信息如下

Hello, Chad Hello, Dan Traceback (most recent call last ): File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 12, in greet_many greet (person ) File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 6, in greet print (greeting + ’, ’ + who_to_greet (someone ))TypeError: can only concatenate str (not ’int’) to str

During handling of the above exception, another exception occurred:

Traceback (most recent call last ): File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 17, in <module> greet_many ([’Chad’, ’Dan’, 1]) File ’/Users/chenxiangan/pythonproject/demo/greetings.py’, line 14, in greet_many print (’hi, ’ + person )TypeError: can only concatenate str (not ’int’) to str

emmmmm,這次好像不太一樣,比之前的內容多了不少,而且有兩個 Traceback 塊信息,這是什么意思呢?

注意這句話

During handling of the above exception, another exception occurred:

它的意思是:在處理上述異常期間,發生了另一個異常。簡單理解就是在 except 中的代碼出現了異常。所以導致了這種現象。

這個例子就是在第三次循環的時候 person=1 然后字符串 hi 和1 不能進行拼接操作,然后再次引發了異常。

查看所有的錯誤信息輸出可以幫助您了解異常的真正原因。

有時,當您看到最后一個異常被引發,并由此產生錯誤信息時,你可能仍然看不出哪里出錯了。比如這例子,直接通過最后的異常看不到問題具體出在哪,這個時候就要考慮繼續往上看了。

到此這篇關于淺談python出錯時traceback的解讀的文章就介紹到這了,更多相關python traceback內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | 苏州柯瑞德货架-仓库自动化改造解决方案| 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 识禅_对禅的了解,从这里开始 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 宜兴市恺瑞德环保科技有限公司| 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 |