python学习第12节:异常处理机制

发布时间:2020/07/11 作者:天马行空 阅读(1031)

1、Python两种错误
Python程序中常出现的是两类错误:语法错误和异常。

1.1、语法错误
不符合Python语法的错误就称作语法错误。有语法错误的程序运行后不能执行,通常会得到SyntaxError的提示,同时会输出在这段程序中检测到的语法错误类型及其所在行号。

1.2、异常
没有语法错误,但在执行过程中,却发生了错误,这时检测到的错误被称为“异常”。
大多数异常不会被解释器自动处理,此时程序就会终止运行,并输出错误信息,错误信息中会给出遇到的异常类型。


图片.png


二、Python常见异常
2.1、NameError异常
当程序中试图使用一个未被赋值的变量时就会引发NameError。

new = old + 1
print(new)


2.2、TypeError异常
把不同类型的数据进行拼接运算的时候通常会发生TypeError异常。

old = "1"
new = old + 1
print(new)


2.3、ModuleNotFoundError异常
使用import导入模块的时候,可能会碰到两种情况:一种是我们输入的模块名字不正确,是个不存在的模块;另一种是我们需要导入的模块虽然存在,但是没有提前下载安装到计算机上。
当出现这两种情况的时候,Python就会报错ModuleNotFoundError。我们需要检查是不是模块名写错了,如果确信无误,就需要排查计算机环境中是否没有安装代码需要import的模块。

import Pandas


2.4、KeyError异常
KeyError异常也是Python常见的异常类型,这种异常经常发生在使用诸如字典这样的键值类型的时候。当试图读取字典中不存在的键时程序会抛出KeyError。
have_list = {"tomato": 5, "oil": 2}
print(have_list["egg"])

2.5、ValueError异常
当传入无效的参数时,就会抛出ValueError异常。

print(int("1"))
print(int("一"))


2.6、IndexError异常
当程序试图对序列(例如列表、元组)进行索引操作时,如果索引超出了序列取值范围,就会抛出IndexError。

number_list = [1, 2, 3]
print(number_list[3])


2.7、OSError异常
当程序中发生与操作系统相关的异常时,例如找不到程序中指定的文件等,就会抛出OSError。

2.8、AttributeError 异常
AttributeError异常是在使用Python的类对象时会遇到的一个错误。
比如:字典中,并没有append()方法。如果你试图用append()为字典追加元素,就会发生AttributeError异常

my_dict = {"Lily": 18, "Bob": 20}
my_dict.append("Tom")


图片.png


三、Python异常处理
当代码发生错误或异常时,Python程序就会中止,这往往不符合我们的需求。
有时候,希望代码在发生某些状况的时候,还可以“顽强”的继续完成;
有时候,我们希望在程序终止之前,将代码千辛万苦已经完成的部分工作结果保存一下。

3.1、try-except-finally语句
在while循环中,首先执行try后面的语句,这些语句可能会发生异常。一旦发生异常,try代码块中的后续代码将不被执行,并把这个异常抛出来。如果这个异常类型与某一个except关键字后的异常类型匹配,那么异常将由这个except语句捕获,然后执行except代码块中的代码。
如果不出现异常,try语句就会全部执行完,而任何的except代码块都不会被执行。
最后,不管有没有发生异常,都会执行finally代码块中的语句。

while True:
    try:
        number = float(input("请输入一个数字:"))
        print("它的倒数是:",1/number)
        # 如果输入正确的倒数,则程序结束
        break
    except ValueError:
        print("输入的不是有效的数字,请重新输入。")
    except ZeroDivisionError:
        print("输入的是0,它没有倒数,请重新输入。")
    finally:
        print("这个程序的功能是求数字的倒数。")


注意:
a、很多时候我们不知道程序可能会发生什么样的异常,这时我们可以省略 except 后面的异常类型,也就是直接写成 except: 。这时,这个 except 会捕捉所有的异常类型。
b、很多时候我们不需要使用finally做最后的处理,这时候可以把finally语句省略。


练习:

while True:
    try:
        num = input('请输入一个数字:')
        num = float(num)
        print(num**2)
        break
    except ValueError:
        print('你输入的不是一个数字,请重新输入')


图片.png


总结:

语法错误:代码不符合Python的语法规定而导致的错误。
异常:因为代码逻辑而导致的错误。
Bug:计算机编码中错误的统称。
Debug:发现和解决程序中Bug的过程。
对异常的处理,采用try-except-finally的结构。

图片.png


练习:检查还缺少哪些材料

ingredients = ['tomato','egg','oil','salt','Onion']
ingredients_have = {'tomato':'five','oil':'enough','salt':'enough'}
ingredients_buy = []
for i in ingredients:
    try:
        ingredients_have[i]
    except KeyError:
        ingredients_buy.append(i)
print('还需要准备这些:{}'.format(ingredients_buy))



关键字python python教程