调试Python程序时经常会报出一些异常,这时就需要我们对异常进行捕获处理,防止程序终止,本篇主要围绕异常处理操作而展开。希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!
01:什么是异常?
1)概念:异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。异常是Python对象,表示一个错误。
2)注意事项:
①一般情况下,在Python无法正常处理程序时就会发生一个异常。
②当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
3)异常作用: 出现异常程序不要退出,可以继续执行同时给予程序员一定的异常提示信息
02:常见的异常种类
异常名称 | 异常描述 |
---|---|
SyntaxError | 语法错误时会抛出此异常 |
NameError | 使用一个还未被赋予对象的变量 |
TypeError | 传入对象类型与要求的不符合 |
ZeroDivisionError | 进行数学运算时除数为0时会出现此异常 |
IndexError | 下标索引超出序列边界 |
KeyError | 试图访问字典里不存在的键 |
ImportError | 无法引入模块或包;基本上是路径问题或名称错误 |
IndentationError | 代码没有正确对齐,即缩进错误 |
ValueError | 传入一个调用者不期望的值,即传入无效的参数 |
AssertionError | 当assert断言条件为假的时候抛出的异常 |
OSError | 操作系统异常 |
更多详细的错误参考:https://www.runoob.com/python/python-exceptions.html
03:异常捕获关键字
异常名称 | 异常描述 |
---|---|
try/except | 捕获异常并处理 |
pass | 忽略异常 |
as | 定义异常实例(except MyError as e) |
else | 如果try中的语句没有引发异常,则执行else中的语句 |
finally | 无论是否出现异常,都执行的代码 |
raise | 抛出/引发异常 |
04:try与except结合用法捕获异常
1)概述:用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。一般捕获已知异常
2)原理:
①首先执行try语句 (try和except关键字之间的(多行)语句)
②如果没有异常发生,则跳过except语句并完成try语句的执行。
③如果在执行try语句时发生了异常,则跳过该子句中剩下的部分。若异常类型和 except关键字后面的异常匹配,则执行 except 语句,然后继续执行try语句之后的代码。
④如果发生的异常和 except 语句中指定的异常不匹配,则将其传递到外部的try语句中;如果没有找到处理程序,则它是一个未处理异常,程序将停止。
while True:
num=input('请输入数字:')
try:
# 如果除数为0时将抛出ZeroDivisionError异常
print('100/%s=%s'%(num,100.0/int(num)))
# 如果捕获到ZeroDivisionError异常将执行except下面的代码块
except ZeroDivisionError:#已知异常,一一对应
print('除数不能输入不能为0哟!!')
05:多个except捕获异常
1)一个try语句可能有多个 except 子句,以指定不同异常的处理程序。最多只会执行一个处理程序
2)一个except子句可以将多个异常命名为带括号的元组,这种写法不区分优先级。except (RuntimeError, TypeError):
while True:
num=input('请输入数字:')
try:
# 如果除数为0时将抛出ZeroDivisionError异常
print('100/%s=%s'%(num,100.0/int(num)))
# 如果捕获到ZeroDivisionError异常将执行except下面的代码块
except ZeroDivisionError:
print('除数不能输入不能为0哟!!')
except ValueError as error: # error表示具体的异常信息
print('除数不能输入字符串哟!!', error)
06:try与except与else捕获异常
1)没有异常的情况下,要执行一段代码。
2)else 子句在使用时必须放在所有的 except 代码块后面,finally前面。
while True:
num=input('请输入数字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except ZeroDivisionError:
print('除数不能输入不能为0哟!!')
except ValueError as error:
print('除数不能输入字符串哟!!', error)
else: #当try代码块中执行没有发现任何异常的时候执行这里的语句
print("Program execution successful")
07:try与except与finally捕获异常
1)不管是否有异常,都要执行一段代码。finally一般要放到最后
2)finally子句对于释放外部资源非常有用
3)应用场景:用在打开文件,在文件处理过程过中出异常退出,这时文件没有关闭或者网络连接
try:
txt = open("C:/Users/qin/Desktop/file1.txt")
# 上面打开文件默认以r方式打开,这里会抛出IOError异常
txt.write("这是一个测试文件,用于测试异常!!")
except IOError as e: # e为异常信息
print("异常信息为:",e)
finally: #不管有没有民常都会执行finally代码块中的语句
txt.close()
08:捕获所有异常(Exception)
1)Exception是所有异常的父类,但是不能通过该程序识别出具体的异常信息
while True:
num=input('请输入数字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except Exception as error: # 异常的父类:所有异常
print('有异常!!', error)
09:捕获具体异常(traceback)
1)traceback可以用来捕获未知异常具体信息
import traceback#捕获具体异常信息模块
while True:
num=input('请输入数字:')
try:
print('100/%s=%s'%(num,100.0/int(num)))
except:
print('有异常!!', traceback.format_exc()) # 捕获具体异常信息
10:主动触发异常(raise)
1)raise语句允许程序员强制发生指定的异常
2)格式:raise 异常类型; raise也可单独使用
for one in range(1,6):
if one ==2:
raise ValueError("当i等于2时抛出这个异常")
print(one)
11:自定义异常
1)Python中也可以自定义特殊类型的异常,只需要从Exception类继承(直接或间接)即可
class SomeException(Exception):
pass
12:断言(assert)
1)使用场景:如果后续代码比较重要且依靠前面的数据/状态
tel=input('请输入手机号:')
assert len(tel)==11,'手机号位数有误'
print('我在测试手机号长度')
13:捕获异常注意事项
1)常用的异常场景:WebUI元素定位、打开文件、数据库连接、调用接口等
2)不是所有的代码都做异常处理,会使代码逻辑看起来复杂化
网友评论