淺談python出錯(cuò)時(shí)traceback的解讀
寫 Python 代碼的時(shí)候,當(dāng)代碼中出現(xiàn)錯(cuò)誤,會(huì)在輸出的時(shí)候打印 Traceback 錯(cuò)誤信息,很多初學(xué)者看到那一堆錯(cuò)誤信息,往往都會(huì)處于懵逼狀態(tài),腦中總會(huì)冒出一句,這都是些啥玩意。如果你是第一次看到它,也許你不知道它在告訴你什么。雖然 Python 的 Traceback 提示信息看著挺復(fù)雜,但是里面豐富的信息,可以幫助你診斷和修復(fù)代碼中引發(fā)異常的原因,以及定位到具體哪個(gè)文件的哪行代碼出現(xiàn)的錯(cuò)誤,所以說(shuō)學(xué)會(huì)看懂 Traceback 信息是非常重要的,另外在面試的時(shí)候也經(jīng)常會(huì)問(wèn)到 Python 中的異常類型及其含義,那么,接下來(lái)就讓我們對(duì)其進(jìn)行詳細(xì)理解。
什么是 Traceback
Traceback 是 Python 錯(cuò)誤信息的報(bào)告。在其他編程語(yǔ)言中有著不同的叫法包括 stack trace, stack traceback, backtrac 等名稱, 在 Python 中,我們使用的術(shù)語(yǔ)是 Traceback。后面我提到的錯(cuò)誤信息等詞都表示Traceback。當(dāng)你的程序?qū)е庐惓r(shí),Python 將打印 Traceback 以幫助你知道哪里出錯(cuò)了。下面是一個(gè)例子來(lái)說(shuō)明這種情況
# example.pydef greet(someone ): print(’Hello, ’ + someon ) greet(’Chad’)
這里首先定義了函數(shù) greet,然后傳入?yún)?shù) someone,然后函數(shù)內(nèi),一個(gè) print 語(yǔ)句其中 someon 是一個(gè)沒有定義的變量,然后通過(guò) greet (’Chad’),調(diào)用剛才定義的 greet 函數(shù),運(yùn)行之后會(huì)出現(xiàn)如下錯(cuò)誤信息。
(Python 中的錯(cuò)誤信息開頭就是 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
此錯(cuò)誤輸出包含診斷問(wèn)題所需的所有信息。錯(cuò)誤輸出的最后一行一般會(huì)告訴你引發(fā)了什么類型的異常,以及關(guān)于該異常的一些相關(guān)信息。錯(cuò)誤信息的前幾行指出了引發(fā)異常的代碼文件以及行數(shù)。
在上面的錯(cuò)誤信息中,異常類型是 NameError,意思是名稱使用了一個(gè)沒定義的名稱(變量、函數(shù)、類)的引用。在本例中,引用的名稱是 someon。
一般情況下看錯(cuò)誤信息的最后一行就能定位到錯(cuò)誤的原因。然后在代碼中搜索錯(cuò)誤提示中的名稱’someon’,然后發(fā)現(xiàn)這是一個(gè)拼寫錯(cuò)誤,然后我們改成 someone 即可。
然而,有些代碼的錯(cuò)誤信息要比這個(gè)復(fù)雜的多。
如何閱讀 Python 的 Traceback 信息?
當(dāng)你想確定代碼為什么引發(fā)異常的時(shí)侯,可以根據(jù) Python 的 Traceback 獲取許多有用的信息。下面,將列舉一些常見的 Traceback,以便理解 Tracebac 中包含的不同信息。
Python Traceback 信息一覽
每個(gè) Python 的 Traceback 信息都有幾個(gè)重要的部分。下圖顯示了各個(gè)組成部分:
藍(lán)框:Traceback 的最后一行為錯(cuò)誤消息行。其中包含引發(fā)的異常名稱。 綠框:異常名稱后面是錯(cuò)誤消息。此消息通常包含有用的信息,用于了解引發(fā)異常的原因。 黃色方框:閱讀順序由下而上,最下面的信息,是拋出錯(cuò)誤的最外層的位置,越往上代碼調(diào)用深度越深。然后每個(gè)出錯(cuò)的文件會(huì)有兩條錯(cuò)誤信息,第一行是 File 后面緊跟著文件的路徑,然后是行數(shù),最后是模塊或者方法名。在 Pycharm 中點(diǎn)擊文件的鏈接即可定位到錯(cuò)誤的位置。
紅色下劃線:第二行就是實(shí)際執(zhí)行的代碼語(yǔ)句了。
一個(gè)具體的例子
通過(guò)一些特定的 Traceback 信息,可以幫助我們更好地理解并查看 Traceback 將提供什么信息。
通過(guò)下面的示例代碼來(lái)說(shuō)明 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 )
定義一個(gè) who_to_greet 函數(shù),然后接受一個(gè)值 person,并根據(jù) if 判斷返回相應(yīng)結(jié)果。
然后,greet 函數(shù)接受一個(gè) someone 和一個(gè)可選的 greeting,之后調(diào)用 print 函數(shù),在 print 中調(diào)用 who_to_greet 函數(shù)并傳入?yún)?shù) someone。
最后,greet_many(),將迭代 people 列表并調(diào)用 greet 函數(shù)。如果通過(guò)調(diào)用 greet()引發(fā)異常,則會(huì)打印一個(gè)簡(jiǎn)單的問(wèn)候語(yǔ)。
只要提供了正確的輸入,此代碼就沒有任何可能導(dǎo)致異常被引發(fā)的錯(cuò)誤。
如果你在 greetings.py 中調(diào)用 greet 函數(shù),并傳入值(例如 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’
之前我們說(shuō)過(guò)閱讀 Python 的 Traceback 信息,是由下而上進(jìn)行閱讀的,這里我們?cè)僖黄鹂匆豢础?/p>
首先,我們需要看的是錯(cuò)誤信息的最后一行,通過(guò)最后一行可以知道錯(cuò)誤的類型以及一些錯(cuò)誤原因。
意思是說(shuō):調(diào)用 greet()的時(shí)候使用了一個(gè)未知的參數(shù),這個(gè)未知參數(shù)就是 greting。
好的,然后我們需要繼續(xù)向上看,可以看到導(dǎo)致異常的行。在這個(gè)例子中我們看到的是調(diào)用 greet 方法的具體代碼。
它的上一行提供了代碼所在文件的路徑,以及代碼文件的行號(hào)以及它所在的模塊。(Pycharm 中通過(guò)點(diǎn)擊文件鏈接可以定位到具體位置)
在這個(gè)例子中,因?yàn)槲覀兊拇a沒有使用任何其他 Python 模塊,所以我們?cè)谶@里看到<module>,它表示所處位置是在執(zhí)行的文件。
使用不同的文件和不同的調(diào)用方式調(diào)用 greet 方法,得到的 Traceback 信息也是不同的,下面就通過(guò)文件導(dǎo)入的形式來(lái)執(zhí)行 greet 方法。看看結(jié)果有什么區(qū)別吧
# example.py from greetings import greet greet (1)
運(yùn)行之后的結(jié)果:
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
在本例中引發(fā)的異常同樣是一個(gè)類型錯(cuò)誤,但這一次消息的幫助要小一些。它只是告訴你,在代碼的某個(gè)地方,字符串只能和字符串拼接,不能是 int。
向上移動(dòng),可以看到執(zhí)行的代碼行。然后是文件和行號(hào)的代碼。不過(guò),這一次我們得到的不是,而是正在執(zhí)行的函數(shù)的名稱 greet()。
然后繼續(xù)往上看,一行執(zhí)行的代碼,我們看到問(wèn)題代碼是 greet()函數(shù)調(diào)用時(shí)傳入了一個(gè)整數(shù)。
有時(shí)在引發(fā)異常之后,另一部分代碼會(huì)捕獲該異常并導(dǎo)致異常。在這種情況下,Python 將按接收順序輸出所有異常信息,最外層的異常信息處于 Traceback 內(nèi)容的最下面位置。
可能看起來(lái)有點(diǎn)懵,下面使用一個(gè)具體例子進(jìn)行說(shuō)明。
在 greetings.py 文件中調(diào)用 greet_many 方式具體調(diào)用代碼如下:
greet_many ([’Chad’, ’Dan’, 1])
運(yùn)行之后輸出的錯(cuò)誤信息如下
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,這次好像不太一樣,比之前的內(nèi)容多了不少,而且有兩個(gè) Traceback 塊信息,這是什么意思呢?
注意這句話
During handling of the above exception, another exception occurred:
它的意思是:在處理上述異常期間,發(fā)生了另一個(gè)異常。簡(jiǎn)單理解就是在 except 中的代碼出現(xiàn)了異常。所以導(dǎo)致了這種現(xiàn)象。
這個(gè)例子就是在第三次循環(huán)的時(shí)候 person=1 然后字符串 hi 和1 不能進(jìn)行拼接操作,然后再次引發(fā)了異常。
查看所有的錯(cuò)誤信息輸出可以幫助您了解異常的真正原因。
有時(shí),當(dāng)您看到最后一個(gè)異常被引發(fā),并由此產(chǎn)生錯(cuò)誤信息時(shí),你可能仍然看不出哪里出錯(cuò)了。比如這例子,直接通過(guò)最后的異常看不到問(wèn)題具體出在哪,這個(gè)時(shí)候就要考慮繼續(xù)往上看了。
到此這篇關(guān)于淺談python出錯(cuò)時(shí)traceback的解讀的文章就介紹到這了,更多相關(guān)python traceback內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. asp文件如何打開2. 怎樣打開XML文件?xml文件如何打開?3. ASP.NET MVC實(shí)現(xiàn)登錄后跳轉(zhuǎn)到原界面4. JSP出現(xiàn)中文亂碼問(wèn)題解決方法詳解5. jsp實(shí)現(xiàn)簡(jiǎn)單用戶7天內(nèi)免登錄6. ASP和PHP文件操作速度的對(duì)比7. Spring依賴注入的三種方式實(shí)例詳解8. ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)9. ASP基礎(chǔ)入門第二篇(ASP基礎(chǔ)知識(shí))10. jsp實(shí)現(xiàn)局部刷新頁(yè)面、異步加載頁(yè)面的方法
