Python异常处理机制

820 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

🤵‍♂️ 个人主页: @Flyme awei 个主页
👨‍💻 作者简介:Python领域新星创作者。
🐋 希望大家多多支持😘一起进步呀!
📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注

Python异常处理机制

  Python程序一般对输入有一定要求,但当实际输入不满足程序要求时,可能会产生程序的运行错误。

一、Bub的由来及分类

1.Bug的由来

  世界上第一部万用计算机的进化版-马克2号(Mark II)

  1945年9月9日,下午三点。哈珀中尉正领着她的小组构造一个称为“马克二型”的计算机。这还不是一个完全的电子计算机,它使用了大量的继电器,一种电子机械装置。第二次世界大战还没有结束。哈珀的小组日以继夜地工作。机房是一间第一次世界大战时建造的老建筑。那是一个炎热的夏天,房间没有空调,所有窗户都敞开散热。

  突然,马克二型死机了。技术人员试了很多办法,最后定位到第70号继电器出错。哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。”

  从此以后,人们将计算机错误戏称为虫子(bug),而把找寻错误的工作称为(debug)。

在这里插入图片描述

2.Bug常见类型

2.1粗心导致的错误

1.漏了末尾的冒号: if 循环语句、 else 语句等 2.缩进错误 3.英文符号写为中文符号 4.把字符串str和数字凭借在一起 5.while循环没有定义变量 6.比较运算符 == 和赋值运算符 = 混用

age = int(input('请输入年龄:'))  # input函数返回值为str类型
if age > 18:
    print('成年了')

2.2知识不熟悉导致的错误

1.index索引越界 2.列表方法lst.append

# 索引越界
lst = [1, 2, 3, 4]
# print(lst[4])
print(lst[3])  # 4


# append()方法使用不熟练
lst = []
# lst = append(1, 2, 3)
lst.append(1)  # 每次只能添加一个元素

2.3思路不清晰导致的错误

# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

# 思路不清晰导致的问题 基础知识不牢固,练练练!!!
lst = [{'rating': [9.7, 2062397], 'id': '1292052', 'type': ['犯罪', '剧情'], 'title': '肖申克的救赎', 'actors': ['蒂姆·罗宾斯', '摩根·弗里曼']},
       {'rating': [9.6, 1528760], 'id': '1291546', 'type': ['剧情', '爱情', '同性'], 'title': '霸王别姬', 'actors': ['张国荣', '张丰毅', '巩俐', '葛优']},
       {'rating': [9.5, 1559181], 'id': '1292720', 'type': ['剧情', '爱情'], 'title': '阿甘正传', 'actors': ['汤姆·汉克斯', '罗宾·怀特 ']}
       ]

name = input('请输入你要查询的演员:')
for item in lst:  # 遍历列表lst  -->{}  item是一个又一个的字典
    act_lst = item['actors']  # 通过item字典中的键actors获取值演员列表
    for actor in act_lst:  # 遍历演员列表
        if name in actor:
            print(name, '出演了', item['title'])

在这里插入图片描述

2.4被动掉坑引起的错误

除零异常

# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

a = int(input('请输入第一个整数:'))
b = int(input('情书如第二个整数:'))
result = a/b  # 注意:0不可以做除数
print('输出结果为:', result)

在这里插入图片描述 解决办法

# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

try:
    a = int(input('请输入第一个整数:'))
    b = int(input('请输如第二个整数:'))
    result = a / b  # 注意:0不可以做除数
    print("{}除{}等于{}".format(a, b, result))
except ZeroDivisionError as error:
    print(error)

在这里插入图片描述

二、异常处理

  Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行

1.try-exception语句

try:
    ...  可能会出异常的代码
    ...
    ...
except xxx(异常类型):
    ...  异常处理代码
    ...
    ...
# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

try:
    a = int(input('请输入第一个整数:'))
    b = int(input('请输如第二个整数:'))
    result = a / b  # 注意:0不可以做除数
    print('输出结果为:', result)
except ZeroDivisionError:
    print('对不起,除数不能为0')
print('程序结束')

在这里插入图片描述 在这里插入图片描述

2.多个except语句

try:
    ...  可能会出异常的代码
    ...
    ...
except Exception1:
    ...  异常处理代码
    ...
    ...
except Exception2:
    ...  异常处理代码
    ...
    ...
except BaseException:
    ...  异常处理代码
    ...
    ...
# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

try:
    a = int(input('请输入第一个整数:'))
    b = int(input('请输如第二个整数:'))
    result = a / b  # 注意:0不可以做除数
    print('输出结果为:', result)
except ZeroDivisionError:
    print('对不起,除数不能为0')
except ValueError:
    print('对不起,只能输入数字串')
print('程序结束')

正常输出: 在这里插入图片描述 除零异常:ZeroDivisionError 在这里插入图片描述 值错误:ValueError 在这里插入图片描述

3.try-except-else结构

如果 try中没有抛出异常,则执行else块;如果try中抛异常,则执行except块,else块不执行。

# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

# 如果 try中没有抛出异常,则执行else块,如果try中抛异常,则执行except块
try:
    a = int(input('请输入第一个整数:'))
    b = int(input('情书如第二个整数:'))
    result = a / b  # 注意:0不可以做除数
except BaseException as e:
    print('出错了', e)
else:
    print('计算结果为', result)

在这里插入图片描述

4.try-except-else-finally结构

finally 无论是否发生异常都会被执行,常用来解释try块中申请的资源

# -*- coding: utf-8 -*-
# @File  : demo.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 10:22

'''
try except else finally 结构
finally 无论是否发生异常都会被执行,能常用来解释try块中申请的资源
'''

try:
    a = int(input('请输入第一个整数:'))
    b = int(input('请输入第二个整数:'))
    result = a / b
except BaseException as e:
    print('出错了', e)
else:
    print('结果为:', result)
finally:
    print('谢谢你的使用')
print('程序结束')

在这里插入图片描述

5.traceback模块

使用traceback模块打印异常信息

# -*- coding: utf-8 -*-
# @File  : 8.trackback模块.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 16:01


import traceback

try:
    print(520)
    print(1 / 0)
except:
    traceback.print_exc()

在这里插入图片描述

三、Python常见异常类型

异常描述
ZeroDivisionError除零异常
IndexError列表中没有次索引(index) 注:索引从零开始
KeyError映射中没有这个键 dic['key']
NaneError未声明/初始化对象 (没有属性)
SyntaxErrorPython语法错误
ValueError传入无效参数

四、PyCharm程序调试

先看一段代码:

# -*- coding: utf-8 -*-
# @File  : PyCharm程序的调试.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/15 16:46


i = 1
while i < 2:
    print(i)

在这里插入图片描述

1.断点

程序运行到此处,暂时挂起,停止执行。此时可以详细观察程序的运行情况,方便做出进一步的判断。

在这里插入图片描述

2.调试

进入调试视图的三种方式:

(1)单击工具栏上的按钮 在这里插入图片描述

(2)右键单击编辑区:点击:debug’模块名’ 在这里插入图片描述

(3)快捷键:shift+F9

五、总结

Python常见异常类型

异常描述
ZeroDivisionError除零异常
IndexError列表中没有次索引(index) 注:索引从零开始
KeyError映射中没有这个键 dic['key']
NaneError未声明/初始化对象 (没有属性)
SyntaxErrorPython语法错误
ValueError传入无效参数