在前面一部分的学习当中, 我们依次对判断这回事、循环的用法、那所谓的四大容器, 还有关于文件进行批量自动化处理的相关知识点, 全部都进行了学习。
你一定遇到过这种崩溃心态:
在代码运行状态完全正确的前提下, 一旦输入的内容发生错误, 应用程序就会立刻出现闪退这一情况。
当发现文件不存在的时候, 程序会直接显示红色的错误文字把整个操作停下来。
把数字输入了中文内容之后, 程序在瞬间就终止了。
在进行数据的批量处理操作时候, 如果其中出现了哪怕一个错误, 那么就会导致整体的所有数据都报废掉。
就是从今天的这一个课开始, 那么你的代码, 它就可以完全地跟崩溃这个词说再见了。
在这节课里面, 我们会学习到关于异常处理这一块的最为关键的工程方面的能力, 具体是使用try这种格式来进行操作的。
所有的工作项目、所有的自动化脚本、所有的爬虫程序以及所有的后台程序, 这一些东西都得百分之百加上。
一、什么是异常?(通俗大白话)
错误, 实际上是被分成了两种种类。
-
代码的编写是有错误的, 标点符号以及缩进的问题处理得并不正确, 这就导致程序在根本运行的时候是无法启动起来的。
-
在执行代码的时候出现了异常状况, 具体表现是程序的语法本身并没有问题, 但是在运行过程当中, 由于碰上了意料之外的数据内容, 从而导致程序直接崩溃。
我们今天学习的, 是关于try这个部分的详细内容。
只解决: 运行出现异常, 使得应用程序发生错示, 但整体状况是没有达到崩溃的程度。
常见异常场景:
一旦用户输入了文字内容, 系统方面就会立刻抛出错误提示进行报错。
当我们去读取一个根本不存在的那个文件的时候, 系统就会直接抛出那个报错的信息出来。
当出现除数等于零的情况的时候, 程序就直接提示报错。
当从列表里面去取值的时候, 如果取值的下标超过了这个列表现有的范围, 那么就会引发错误。
二、这玩意儿啊, 就是特别、特别万能的那个核心语法知识, 你必须得把它死死地记住, 并且背下来。
try:
存在这样的风险代码, 它们是有可能出现报错的情况的。
pass
:
报错之后执行的补救代码
pass
这个逻辑方面, 其实是非常简单的。
-
先试一下在执行, 发现代码没有问题, 所以就顺顺利利地跑完了。
-
一旦在 try 代码块里面出现了报错, 就会立刻停止当前的运行流程, 并且跳转到指定的处理逻辑去继续执行, 这样一来, 程序就不会因为错误而崩溃。
三、对于新手的第一课来说, 我们可以从最简单的防崩溃案例开始看。
场景:输入数字,输错不闪退
没有异常处理(会崩溃)
通过input函数的调用结果, 也就是在屏幕上显示的写着请输入数字的这段文字, 经过转换成整数类型之后的值, 被赋值给了num这个变量名。
print("你输入的数字是", num)
如果直接把字母输进去的话, 程序会马上出现红色的字然后停止运行。
把 try-加上去, 因为这样可以做到永远都不会崩溃。
try:
通过input函数的调用结果, 也就是在屏幕上显示的写着请输入数字的这段文字, 经过转换成整数类型之后的值, 被赋值给了num这个变量名。
输出的是"输入成功!数字是: "这个说法, 接着是变量`num`里面存放的那个数值。
:
输出提示, 内容为输入错误后请重新键入数字字符。
当发生错误时, 系统不会崩溃, 也不会出现闪退的情况。它会给出友好提示, 让程序能够继续运行下去。
四、把指定的那个错误给精准地捕获到, 这是企业标准写法。
官方的规范明确指出, 千万不要进行裸露的操作, 而是要实现精确捕捉错误的功能。
- 这个错误的值问题存在, 并且它是最为常见的那样一种情况。
输入的类型是不对的, 或者在进行类型转换这个操作的期间失败了。
try:
让一个变量去接受这个叫age的东西, 然后用整数的方式来把那个从键盘里读出来的文字给弄好, 这个行为呢, 是要让人们知道这是在输入年龄的这个信息。
:
输出一个这样的提示语, 意思就是, 必须要输入一个整形的数字, 绝对不能输入文字内容, 具体表现是通过print函数来打印出一句话。
- 除零错误
try:
res = 10 / 0
:
print(" 数学错误:除数不能为0")
- 那个被指定的文件, 它是并不存在的一个状态。
完美解决上节课文件批量读取报错
try:
变量 f 被设定为打开一个名为 abc.txt 的文件, 读取模式为只读, 并且指定使用的字符编码格式是要 utf-8。
:
print(" 文件不存在,跳过读取")

五、完整四件套:try + + else + (全套终极结构)
工作项目全部都使用了这套体系, 是非常规范的。
去试一试, 动手操作一下。
如果出现了错误, 那么就开始进行执行。
- else: 在没有发生任何错误的情形之下, 才会被予以执行。
不管这个情况到底是不是存在错误, 在程序的运行顺序里, 它都是在最后那个环节里面去无条件地执行。
try:
num = int(input("输入数字:"))
:
print(" 输入有误")
else:
把打印功能启动, 内容是, 输入的情况属于正确状态, 随后跟上你的数字这个内容, 具体的数值由变量num来确定。
:
print("------本轮输入结束------")
四件套使用场景
-
只有在出现正确答案的情况下, 才会执行计算操作, 并且完成数据保存以及将数据存储到数据库中的步骤。
-
先把文件给关掉, 顺便把连接也断开, 最后把这些收尾性的操作给做完。
六、获取那些详细的报错信息,这个可是用来排错的神器。
作为在工作过程中去排查问题所必不可少的一种资料, 需要将导致错误的具体原因内容进行打印输出操作。
try:
10 / 0
as e:
print("详细错误原因:", e)
这是一个用来万能捕获所有异常的处理方式, 主要是为了起到一个兜底下的保护作用。
七、这是一个实战当中的大的案例, 就是把那个待办事项的系统给进行改造, 改造成那种永远都不会出现闪退状况的版本。
在第71讲我们提到了待办系统这件事, 现在我们把异常处理这个部分给它加上去, 这样一来呢, 那个程序就会变得特别稳当, 能够达到商业级别的要求和标准了。
解决:用户乱输入导致程序崩掉
=
while True:
print("\n1.添加任务 2.查看任务 3.退出")
try:
= int(input("请选择功能:"))
如果是等于一这种情况。
t = input("输入任务:")
.(t)
print("添加成功")
elif == 2:
打印出来这个任务列表的情况是这样子的。
elif == 3:
print("退出系统")
break
else:
print("请输入1-3的数字")
:
提示非法输入, 仅可录入数字数据!
不管用户怎么样去胡乱地输入一些东西, 这个程序都永远不会出现崩溃的情况。
八、这节课的核心要点总结, 也就是那个超级简单好记的口诀。
-
try: 把可能会冒出错误问题的代码放置到这里面。
-
进行报错补救, 并且防止发生系统崩溃。
-
只有在上层的条件判定没有出现错误的情况下, 这个环节才会被启动。
-
不管怎么样, 它都是会被实施下去的。
-
就是那三个方面, 也就是出现得最经常的三种错误。
九、什么时候必须加 try-?
-
关于用户提交交互这个代码这件事。
-
进行文件的读取与写入操作, 以及对文件进行批量的遍历处理。
-
爬虫网络请求
-
把数据进行转换, 然后针对数据进行批量的处理操作。
-
长时间运行的自动化脚本
课后作业
-
编写一个用于进行除法运算的计算程序, 该程序需要获取两个数字作为输入, 并将这两个数字执行相除的操作。
-
需要增加对异常情况的处理机制。
在输入文字提示的时候, 出现了错误的情况。
当除数为零时, 需要单独提示。
- 不管是谁, 要是乱输入一堆内容, 都必须得要确保系统绝对不能出现闪退的这个情况。