数据挖掘: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
相关文章
相关标签/搜索