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

程序员书单

共 4016字,需浏览 9分钟

 ·

2020-12-26 18:20


阅读文本大概需要 6 分钟


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

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

有报错信息

运行程序,啪,很快啊,控制台出现了报错信息,这时我们需要读懂报错信息,有些伙伴发到群里的报错信息很明显了,可是他却看不懂。所以 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 或者发群里请教其他伙伴,空余时间把自己不会的知识点多看看,这样提升的速度会快一些。

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

— 【 THE END 】—
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!


3T技术资源大放送!包括但不限于:Java、C/C++,Linux,Python,大数据,人工智能等等。在公众号内回复「1024」,即可免费获取!!




浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报