发生甚莫事了?我的程序为啥又报错了!

共 4157字,需浏览 9分钟

 ·

2020-11-30 21:44

点击上方Python知识圈设为星标

回复100获取100题PDF



阅读文本大概需要 6 分钟


近期精彩文章Python100例(附PDF下载地址)

作者:pk哥

原创公众号:Python知识圈

刚才在技术群里有个伙伴艾特我,我说发生甚么事了?给我发了几张截图,我一看,哦,原来是运行程序报错了。我说你不会看报错信息么,这不好用,他不服气,我说我教你们读懂报错信息,这个有用,这是化劲儿。

言归正传,运行程序出错或者没有出现我们想要的结果,我们每天都会遇到这样的问题,遇到问题没关系,重要的是我们知道怎么找出问题的根源,然后解决问题。

有报错信息

运行程序,啪,很快啊,控制台出现了报错信息,这时我们需要读懂报错信息,有些伙伴发到群里的报错信息很明显了,可是他却看不懂。所以 pk哥给大家总结下常见的报错场景。

不要怕看报错信息,常见的报错就这几种,记住就行。

首先,我们需要知道常见的报错关键字。

SyntaxError:语法错误,代码形式错误

AttributeError:属性错误,特性引用和赋值失败时会引发属性错误

NameError:试图访问的变量名不存在

Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。

IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误

KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误

IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引

TypeError:类型错误,内建操作或是函数于在了错误类型的对象时会引发类型错误

ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误

ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。

下面举例说明下这几种常见的报错。

SyntaxError

SyntaxError,语法错误,报错信息里出现这个关键字,我们就要意识到语法有问题,报错信息再往上看,报错信息中还会用 ^ 指出语法出现问题的具体问题,这样我们就能快速定位语法有问题的地方。比如下面 for 循环后面忘了加冒号导致的语法错误。

这些语法错误没有技巧了,初学者只有记下来,可以多看看 Python 编程规范:PEP8 规范。我收集了 PEP8 规范的中文版和英文版 PDF,需要的加我微信(微信号:RookieProM)获取,记得备注“PEP8”。


AttributeError

属性错误,特性引用和赋值失败时会引发属性错误,举个例子,做过爬虫小项目的伙伴应该对 requests 库的用法比较熟悉。

response = requests.get(url)

用 requests 请求返回的数据为 requests.models.Response,你可以在实例中打印出它的类型查看。

response = requests.get(url, headers=headers)

print(type(response))

# 结果
'requests.models.Response'>

Response 响应的常用属性如下:

response.text     # 响应回去的文本(字符串)
response.content   # 响应回去的内容(二进制),一般用来爬取视频
response.status_code   # 响应的状态码
response.url    # 获取请求连接地址
response.cookies    # 获取返回的cookies信息
response.cookies.get_dict()   # 获取返回的cookies信息
response.request   # 获取请求方式

那如果对象不是 Response 类型,你也用来调用 text 属性,这时就会报属性错误:AttributeError

NameError

NameError,试图访问的变量名不存在,这个容易理解,有时变量名忘了定义或者变量名写错了都会报这个错。

program_language = 'Python'
name = '知识圈'

official_accounts = programer_language + name

上面例子中,我故意写错了一个单词 programer_language,这个单词没定义,所以会直接报 NameError 的错误。

NameError: name 'programer_language' is not defined

IOError

操作文件出错会报 IOError 的错误或者 IOError 的子类 FileNotFoundError。

with open('Python.txt''r', encoding='utf-8') as f:
    f.read()

上方我打开的是一个在此目录下不存在的文件 Python.txt,运行后会报 FileNotFoundError。

FileNotFoundError: [Errno 2] No such file or directory: 'Python.txt'

KeyError

使用了映射中不存在的关键字(键)时引发的关键字错误,比如我们读取字典时,读取的 key 值不存在时会报 KeyError。

infos = {'official_accounts''Python知识圈''Bilibili''菜鸟程序员的日常'}

print(infos['official_accounts'])
print(infos['zhihu'])

上面例子中,key 值为 official_accounts 的值是可以取到的,但是 key 值为 zhihu 的无法取到,会报 KeyError 的错。

KeyError: 'zhihu'

IndexError

索引错误,序列中没有此索引(index),索引超出序列范围时会报此错。

infos = ['official_accounts''Python知识圈''Bilibili''菜鸟程序员的日常']

print(infos[5])

上面列表中有 4 个元素,索引最大是 3,因为索引从 0 开始,所以取索引为 5 的值时,会报 IndexError 的错。

IndexError: list index out of range

TypeError

类型错误,内建操作或是函数用于在了错误类型的对象时会引发类型错误。

class Ball:
    def _init_(self, color, size, direction):
        self.color = color
        self.size = size
        self.direction = direction

    def bounce(self):
        if self.direction == "down":
            self.direction = "up"


myBall = Ball("red""small""down")

上面例子中,运行程序会报 TypeError 的错误,原因是构造函数 init 前后应该是双下划线 __init__ ,上面写成了单下划线。

TypeError: object() takes no parameters

ZeroDivisonError:

除数为 0,在用除法操作时,第二个参数为 0 时引发了该错误。

a = 100
b = 0

c = a/b
print(c)

这个还好理解,除数为 0 了,会报这个错。

ZeroDivisionError: division by zero

上面举例讲了几个常见的异常场景,你只有读懂了这些报错信息,你才知道你的代码是哪里出了错。程序一旦出错,是一级一级往上报,控制台也能看到报错的具体行数。

对于程序项目中的异常,我们可能会对他进行 try except 异常处理,当然这是另一个主题需要分享的知识点,这里就不再赘述。

debug调试代码

如果没有明显的报错信息的话,比如我们经常做爬虫项目的时候,返回了一个空列表。这时我们就需要对代码进行 debug。小伙伴喜欢用 print 函数去打印主要的变量,有些直接用编辑器 Pycharm 里面的 debug 功能。

我们在需要调试的代码前单击,前面会显示红色实心圆,整行代码也会显示红色背景,也可以点击多行进行 debug,如下例子中,计算 1 到 100 相加之和,我在计算求和的代码处加了 debug,右键选择 Debug 选项调试代码。

代码运行到我们 debug 的地方时,会停下来,需要我们手动点击 Debugger 输出框里的 Step Over 按钮程序才会继续往下执行。

点击 Step Over 按钮执行时,对应的 Debug 处的后面还会显示对应变量的变量,便于我们查看执行过程。

面向谷歌编程

如果上面两步都尝试了,发现你还是没法解决问题,那可能是你有些知识点没掌握到,这时就是在搜索引擎中找找答案了,有名的技术问答社区 stackoverflow.com 或者发群里请教其他伙伴,空余时间把自己不会的知识点多看看,这样提升的速度会快一些。

总之,能快速找到问题所在,解决问题,总结问题,这样进步就很快了。

编程界要以和为贵,再见,朋友们!

pk哥个人微信


添加pk哥个人微信即送Python资料


→ Python知识点100题的PDF

→ Python相关的电子书10本


记得备注:“100题”




往期推荐
01

求你了,别再用 pip 那乌龟的速度去安装库了!

02

Python100例(附PDF下载地址)

03

马保国一年能挣多少钱?


点击阅读原文查看pk哥原创视频

我就知道你“在看”

浏览 60
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报