欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談python出錯時traceback的解讀

 更新時間:2020年07月15日 14:29:57   作者:知章  
這篇文章主要介紹了淺談python出錯時traceback的解讀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

什么是 Traceback

Traceback 是 Python  錯誤信息的報(bào)告。在其他編程語言中有著不同的叫法包括 stack trace, stack  traceback, backtrac  等名稱, 在 Python  中,我們使用的術(shù)語是 Traceback。后面我提到的錯誤信息等詞都表示Traceback。
當(dāng)你的程序?qū)е庐惓r,Python 將打印 Traceback 以幫助你知道哪里出錯了。下面是一個例子來說明這種情況

# example.py
def greet(someone ):
  print('Hello, ' + someon )
 
greet('Chad')

這里首先定義了函數(shù) greet,然后傳入?yún)?shù) someone,然后函數(shù)內(nèi),一個 print  語句其中 someon  是一個沒有定義的變量,然后通過 greet ('Chad'),調(diào)用剛才定義的 greet  函數(shù),運(yùn)行之后會出現(xiàn)如下錯誤信息。

(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

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

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

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

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

如何閱讀 Python 的 Traceback  信息?

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

Python Traceback 信息一覽

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

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

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

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

 一個具體的例子

通過一些特定的 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  函數(shù),然后接受一個值 person,并根據(jù) if  判斷返回相應(yīng)結(jié)果。

然后,greet  函數(shù)接受一個 someone 和一個可選的 greeting,之后調(diào)用 print  函數(shù),在 print 中調(diào)用 who_to_greet 函數(shù)并傳入?yún)?shù) someone。

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

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

如果你在 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'

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

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

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

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

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

在這個例子中,因?yàn)槲覀兊拇a沒有使用任何其他 Python  模塊,所以我們在這里看到<module>,它表示所處位置是在執(zhí)行的文件。

使用不同的文件和不同的調(diào)用方式調(diào)用 greet 方法,得到的 Traceback  信息也是不同的,下面就通過文件導(dǎo)入的形式來執(zhí)行 greet 方法??纯唇Y(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ā)的異常同樣是一個類型錯誤,但這一次消息的幫助要小一些。它只是告訴你,在代碼的某個地方,字符串只能和字符串拼接,不能是 int。

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

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

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

可能看起來有點(diǎn)懵,下面使用一個具體例子進(jìn)行說明。

在 greetings.py  文件中調(diào)用 greet_many  方式具體調(diào)用代碼如下:

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

運(yùn)行之后輸出的錯誤信息如下

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)容多了不少,而且有兩個 Traceback 塊信息,這是什么意思呢?

注意這句話

During  handling  of  the  above  exception, another  exception  occurred:

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

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

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

有時,當(dāng)您看到最后一個異常被引發(fā),并由此產(chǎn)生錯誤信息時,你可能仍然看不出哪里出錯了。比如這例子,直接通過最后的異??床坏絾栴}具體出在哪,這個時候就要考慮繼續(xù)往上看了。

到此這篇關(guān)于淺談python出錯時traceback的解讀的文章就介紹到這了,更多相關(guān)python traceback內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python?Socket實(shí)現(xiàn)搭建HTTP協(xié)議

    使用Python?Socket實(shí)現(xiàn)搭建HTTP協(xié)議

    網(wǎng)絡(luò)編程中,了解底層的通信機(jī)制是極其重要的,本文將帶領(lǐng)大家深入探索如何使用Python的socket庫來實(shí)現(xiàn)一個簡單的HTTP協(xié)議,感興趣的可以了解下
    2024-02-02
  • python如何在循環(huán)引用中管理內(nèi)存

    python如何在循環(huán)引用中管理內(nèi)存

    這篇文章主要為大家詳細(xì)介紹了python如何在循環(huán)引用中管理內(nèi)存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Django migrations 默認(rèn)目錄修改的方法教程

    Django migrations 默認(rèn)目錄修改的方法教程

    這篇文章主要介紹了Django migrations 默認(rèn)目錄修改的方法教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Python pandas自定義函數(shù)的使用方法示例

    Python pandas自定義函數(shù)的使用方法示例

    這篇文章主要介紹了Python pandas自定義函數(shù)的使用方法,結(jié)合實(shí)例形式分析了pandas模塊相關(guān)自定義函數(shù)數(shù)值運(yùn)算操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python下Fabric的簡單部署方法

    Python下Fabric的簡單部署方法

    這篇文章主要介紹了Python下Fabric的簡單部署方法,Fabric是Python下一個流行的自動化工具,需要的朋友可以參考下
    2015-07-07
  • Python 2/3下處理cjk編碼的zip文件的方法

    Python 2/3下處理cjk編碼的zip文件的方法

    今天小編給大家分享Python 2/3下處理cjk編碼的zip文件的方法,在項(xiàng)目中經(jīng)常會遇到這樣的問題,小編特意分享到腳本之家平臺,感興趣的朋友跟隨小編一起看看吧
    2019-04-04
  • Python基礎(chǔ)教程之多線程編程詳解

    Python基礎(chǔ)教程之多線程編程詳解

    Python支持多線程編程和多進(jìn)程編程,在本教程中,我們將學(xué)習(xí)有關(guān)Python多線程編程的基礎(chǔ)知識、線程同步、線程池以及如何使用多進(jìn)程,需要的朋友可以參考下
    2023-06-06
  • Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)

    Python+OpenCV圖像處理之直方圖統(tǒng)計(jì)

    直方圖就是對圖像的另外一種解釋,它描述了整幅圖像的灰度分布。通過直方圖我們可以對圖像的亮度、灰度分布、對比度等有了一個直觀的認(rèn)識。本文將為大家詳細(xì)介紹一下如何通過OpenCV實(shí)現(xiàn)直方圖統(tǒng)計(jì),感興趣的可以了解一下
    2021-12-12
  • PyTorch dropout設(shè)置訓(xùn)練和測試模式的實(shí)現(xiàn)

    PyTorch dropout設(shè)置訓(xùn)練和測試模式的實(shí)現(xiàn)

    這篇文章主要介紹了PyTorch dropout設(shè)置訓(xùn)練和測試模式的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。
    2021-05-05
  • 實(shí)例講解Python中整數(shù)的最大值輸出

    實(shí)例講解Python中整數(shù)的最大值輸出

    在本篇文章里小編給大家分享了關(guān)于Python中整數(shù)的最大值輸出的實(shí)例內(nèi)容,以及相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03

最新評論