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 |
未声明/初始化对象 (没有属性) |
SyntaxError |
Python 语法错误 |
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