点击上方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 循环后面忘了加冒号导致的语法错误。
![d857e13044ff86a879162c707321fa4d.png](https://i-blog.csdnimg.cn/blog_migrate/637a61f3eacffeb7907f8d9bbed9d3aa.png)
这些语法错误没有技巧了,初学者只有记下来,可以多看看 Python 编程规范:PEP8 规范。我收集了 PEP8 规范的中文版和英文版 PDF,需要的加我微信(微信号:RookieProM)获取,记得备注“PEP8”。
![8e57f7c4575187727c1cb82e0306d794.png](https://i-blog.csdnimg.cn/blog_migrate/73c0895f815769386427d37fbf2d9090.png)
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
上面举例讲了几个常见的异常场景,你只有读懂了这些报错信息,你才知道你的代码是哪里出了错。程序一旦出错,是一级一级往上报,控制台也能看到报错的具体行数。
![8f7895d8d5d7bd27c8da0099f2dbd71d.png](https://i-blog.csdnimg.cn/blog_migrate/eed6aa9ddc94ae22572148b4e002274b.png)
对于程序项目中的异常,我们可能会对他进行 try except 异常处理,当然这是另一个主题需要分享的知识点,这里就不再赘述。
debug调试代码
如果没有明显的报错信息的话,比如我们经常做爬虫项目的时候,返回了一个空列表。这时我们就需要对代码进行 debug。小伙伴喜欢用 print 函数去打印主要的变量,有些直接用编辑器 Pycharm 里面的 debug 功能。
我们在需要调试的代码前单击,前面会显示红色实心圆,整行代码也会显示红色背景,也可以点击多行进行 debug,如下例子中,计算 1 到 100 相加之和,我在计算求和的代码处加了 debug,右键选择 Debug 选项调试代码。
![dcd37ffbbfabf6fc946a01684bd42df0.png](https://i-blog.csdnimg.cn/blog_migrate/2b1c4bcb0664b49f5c8b455bdf8c38d6.png)
代码运行到我们 debug 的地方时,会停下来,需要我们手动点击 Debugger 输出框里的 Step Over 按钮程序才会继续往下执行。
![44163526cd2264fdd516121921199aee.png](https://i-blog.csdnimg.cn/blog_migrate/9e6edb610182826b682d8fadcbc2c04a.png)
点击 Step Over 按钮执行时,对应的 Debug 处的后面还会显示对应变量的变量,便于我们查看执行过程。
![10e71d8c3dc5570657ebaf54dcacaeb4.gif](https://i-blog.csdnimg.cn/blog_migrate/f6f3cd76872180d89dc30c55216abae3.gif)
面向谷歌编程
如果上面两步都尝试了,发现你还是没法解决问题,那可能是你有些知识点没掌握到,这时就是在搜索引擎中找找答案了,有名的技术问答社区 stackoverflow.com 或者发群里请教其他伙伴,空余时间把自己不会的知识点多看看,这样提升的速度会快一些。
总之,能快速找到问题所在,解决问题,总结问题,这样进步就很快了。
编程界要以和为贵,再见,朋友们!
pk哥个人微信
添加pk哥个人微信即送Python资料
→ Python知识点100题的PDF
→ Python相关的电子书10本
记得备注:“100题”
往期推荐01
求你了,别再用 pip 那乌龟的速度去安装库了!
02
Python100例(附PDF下载地址)
03
马保国一年能挣多少钱?
↓点击阅读原文查看pk哥原创视频