數據挖掘:Python的錯誤和調試

在咱們的程序運行中,不可避免地會出現各類各樣的錯誤。形成這些錯誤的緣由也多種多樣,多是由於代碼邏輯存在疏漏,某一種狀況咱們沒有考慮到;也多是由於用戶的特殊操做,使咱們的程序陷入了不曾涉及的場景……html

錯誤處理

當Python將錯誤信息輸出到控制檯後,咱們首先須要定位到錯誤發生的位置。python

def test(name):
    return int(name)
test("cbekd")
複製代碼

例如,以上代碼運行時會出現以下錯誤信息:bash

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    test()
  File "test.py", line 2, in test
    return int("cbekd")
ValueError: invalid literal for int() with base 10: 'cbekd'
複製代碼

以上錯誤信息就是發生這個錯誤以前的調用狀況的跟蹤信息,由上向下是從程序開始運行到發生錯誤的過程。網絡

在上例中:第2行-第3行是咱們調用test()方法的過程,第4行-第5行是由於咱們將非數字字符串轉換爲數值類型產生錯誤的位置,第6行爲錯誤的提示信息。所以,咱們須要解決的就是代碼中第2行的錯誤。框架

面對這些各類各樣的問題,在初學階段,咱們能夠經過直接百度錯誤的提示信息,就能找到這個錯誤發現的緣由,進而找到解決這個問題的方法。機器學習

可是當咱們逐漸開始學習一些更復雜、更小衆的模塊時,在百度上就愈來愈難直接找到解決方案。這時,咱們就須要開始習慣直接使用錯誤提示或參考文檔等方式來解決問題。學習

try...except...

下面咱們來了解Python提供的錯誤處理方法(try...except...finally...)。ui

當咱們認爲某些代碼可能會出現錯誤,致使後續的代碼沒法正常運行時,咱們可使用try來運行這段代碼;此時,若是確實發生了錯誤,那麼try所包含的代碼中的後續代碼將不會運行,而是直接跳轉至except中的代碼;不管在運行try中的代碼時是否出現錯誤,finally中的代碼均會被執行。spa

例如:調試

try:
    print("try...before...")
    int("cbekd")
    print("tyy...after...")
except ValueError as e:
    print("except...", "detail:", e)
finally:
    print("finally...")
複製代碼

運行結果:

try...before...
except... detail: invalid literal for int() with base 10: 'cbekd'
finally...
複製代碼

每個try均可以有多個不一樣的except,分別來處理不一樣類型的錯誤狀況。Python中全部的錯誤都是BaseException的子類,因此當咱們沒法預知代碼會出現什麼樣的錯誤、或者但願處理全部可能的錯誤時,可使用except BaseException來處理全部的錯誤狀況。

Python文檔中對錯誤之間關係的說明詳見: docs.python.org/3/library/e…

調試技巧

有的時候,咱們遇到的問題雖然找到了問題發生的位置,可是並非問題根源的位置,例若有的時候咱們發現錯誤是由於某個變量錯誤的值致使的,可是咱們殊不知道這個變量到底是從哪裏開始錯的。此時,咱們能夠經過print()或assert等方法將各階段中變量的值輸出到控制檯,進而尋找錯誤到底是從哪一步開始發生的,這種調試方法咱們一般稱之爲「斷點調試」。

此外,Python內置的pdb模塊提供了交互性的代碼調試功能,包括設置斷點、單步調試等,能夠用來輔助咱們的斷點調試。例如,當在代碼中添加了pdb.set_trace()後直接運行腳本,代碼會停留在pdb.set_trace()的位置,等待咱們輸入命令。

pdb經常使用的命令以下:

file

例如,在以前例子中,咱們使用pdb添加了斷點,其代碼以下。

import pdb

def test(name):
    pdb.set_trace()
    return int(name)

test("cbekd")
複製代碼

運行運行以上代碼,獲得以下結果(其中(Pdb)後的內容爲輸入的命令):

> test.py(5)test()
-> return int(name)
(Pdb) pp name
'cbekd'
(Pdb) n
ValueError: invalid literal for int() with base 10: 'cbekd'
> test.py(5)test()
-> return int(name)
(Pdb) 
複製代碼

文源網絡,僅供學習之用,若有侵權請聯繫刪除。

在學習Python的道路上確定會碰見困難,別慌,我這裏有一套學習資料,包含40+本電子書,800+個教學視頻,涉及Python基礎、爬蟲、框架、數據分析、機器學習等,不怕你學不會! shimo.im/docs/JWCghr… 《Python學習資料》

關注公衆號【Python圈子】,優質文章每日送達。

file
相關文章
相關標籤/搜索