一、处理异常
1.1 常见异常
ValueError | 传入的值错误 |
IndexError | 索引超出序列范围 |
AttributeError | 对象不存在访问对象的属性和方法时 |
TypeError | 输入的值类型不合适 |
NameError | 访问一个没有声明的变量 |
KeyError | 请求一个不存在的字典key |
IOError | 输入输出错误(比如要读取的值不存在) |
ImportError | import无法找到模块或相应的变量函数名称时 |
1.2 异常处理语句
1.2.1 try...except
1.2.1.1 语法:
try:
可能出现异常的代码块
except [异常名称] [as alias]:
出现异常时输出的代码块
① 异常名称是可选参数,如果不指定异常名称时,将捕捉所有异常;
② 同一个except语句可以指定多个异常,多个异常用小括号括起来,通过逗号分隔开;
③ try后也可以跟多个except语句
④ as alias是可选参数,可以为异常指定别名;
⑤ 出现异常时抛出的信息,可以为固定的提示语,也可以通过别名输出异常信息
s = '春眠'
try:
t = int(s)
print(t)
except ValueError as a:
print('出错了', a)
except NameError as b:
print('出错了', b)
# 出错了 invalid literal for int() with base 10: '春眠'
# 只捕捉到了ValueError,未捕捉到NameError
1.2.1.2 else和finally
try:
可能出现异常的代码块
except [异常名称] [as alias]:
出现异常时输出的代码块
else:
未出现异常时输出的代码块
finally:
无论是否出现异常都输出的代码块
① else跟在所有的except后,用于指定无异常抛出时的信息,比如:“xxx顺利进行”
② finally跟在所有语句后,用于指定任何情形下都执行的代码,即使发生异常,也会被执行。
③ finally常用于一些清理工作,比如,关闭文件,释放资源等。
s = '12345'
try:
t = int(s)
print(t)
except ValueError as a:
print('出错了', a)
else:
print('str转化int顺利执行')
finally:
print('执行了一次转化字符串的操作')
# 12345
# str转化int顺利执行
# 执行了一次转化字符串的操作
1.2.2 raise
1.2.2.1 语法
raise [异常名称([异常信息])]
① 异常名称是可选参数,如果不选择,只能用于except语句中,原样抛出异常
② 异常信息也是可选参数,如果不选择,只会抛出异常名称
1.2.2.2 异常处理顺序
① raise捕捉异常,而后直接跳转异常处理语句
② 跳转except异常处理语句
③ except处理完后,直接执行后续代码,不会跳转回抛出异常的位置,
④ 所以,raise和except之间的语句没机会被执行
try:
s = '春眠'
if s == '春眠':
raise ValueError('文字字符串不能转化为数字') # ①捕捉异常,而后直接跳转异常处理语句
print('这条语句无法执行') # ⑤所以这条语句将不被执行
except ValueError as a: # ②异常处理语句
print('出错了', a) # ③处理异常,处理完后直接执行后续代码,不会跳转回抛出异常的位置,
print('执行了一次转化字符串的操作') # ④异常处理完后直接从这里执行
1.2.2.3 raise的不同使用情况
① 异常名称、异常原因全部使用:
抛出指定的异常信息。如:"文字不能转化为数字"
try:
s = '春眠'
if s == '春眠':
raise ValueError('文字不能转化为数字')
except ValueError as a:
print('出错了', a)
print('执行了一次转化字符串的操作')
"""
出错了 文字不能转化为数字
执行了一次转化字符串的操作
"""
② 只使用异常名称,省略异常信息:
只抛出异常名称,无异常信息
try:
s = '春眠'
if s == '春眠':
raise ValueError
except ValueError as a:
print('出错了', a)
print('执行了一次转化字符串的操作')
"""
出错了
执行了一次转化字符串的操作
"""
③ 只使用raise :
仅能用于except语句中,用于except捕获异常后,重新抛出这个异常。
如果后面没有再一个except语句重新捕获,后续的语句将无法执行。如:
try:
a = 10/0
except ZeroDivisionError as e:
print('出错了')
raise
print('这条语句无法执行')
"""
出错了
Traceback (most recent call last):
File "D:\PyCharm Community Edition 2023.2.1\plugins\python-ce\helpers\pydev\pydevconsole.py", line 364, in runcode
coro = func()
^^^^^^
File "<input>", line 2, in <module>
ZeroDivisionError: division by zero
"""
1.3 程序调试
1.3.1 Pycharm的debug(摘自百度AI知道)
PyCharm的Debug功能非常强大,可以帮助开发者在代码运行过程中暂停、单步执行、查看变量值等,以便找出并解决问题。PyCharm的Debug功能的基本步骤:
- 设置断点:在需要暂停代码执行的位置,点击代码行号旁边的空白处,会出现一个红点,表示在该位置设置了一个断点123。断点可以设置在需要观察的代码行,例如循环、条件判断、函数调用等位置。
- 启动Debug模式:有几种方法可以启动Debug模式:
- 点击代码编辑器左侧边栏的绿色虫子图标2。
- 在需要Debug的文件上右键,选择“Debug”选项2。
- 在代码编辑界面的空白处右键,选择“Debug”2。
- 使用快捷键,例如
Shift+F9
1。
- Debug界面与操作:
- 控制区域:Debug界面通常包含控制代码执行走向的区域。其中,常见的操作有:
- **Step Over (F8)**:执行当前行并跳到下一行,如果下一行是函数调用,则不会进入函数内部3。
- **Step Into (F7)**:执行当前行并进入任何函数调用3。
- **Step Out (Shift+F8)**:当在函数内部时,执行此操作将跳出当前函数,并返回上一层函数的执行点3。
- Run to Cursor:直接运行到光标所在的位置3。
- 变量查看器:在Debug界面的某一部分,你可以查看当前所有可用的变量及其值3。
- Console窗口:这个窗口可以用来执行额外的代码或查看程序给出的错误信息3。
- 控制区域:Debug界面通常包含控制代码执行走向的区域。其中,常见的操作有:
- Debug交互:在Debug暂停时,你可以在Console窗口中进行交互,例如计算变量的值、调用方法等1。
- 断点属性:你可以通过右键点击断点来查看和更改断点的属性,例如条件断点等3。
- 结束Debug:当你完成Debug并希望继续正常执行程序时,可以点击“Stop”按钮或关闭Debug窗口来结束Debug模式。
图示:
1.3.2 assert语句
assert:断言;一般用于对程序在某个时刻必须满足的条件进行验证
语法格式:
assert expression[,reason]
expression: 表达式,对表达式做出判断,如果为True什么都不做,如果为False,抛出异常,异常类型AssertionError
reason: 可选参数,描述AssertionError,注意逗号
assert语句可以和异常处理语句结合起来用,如:
def main():
a = 10
b = 0
assert b != 0, '除数不能为0'
print(a/b)
try:
main()
except AssertionError as e:
print('出错了,',e) # 出错了, 除数不能为0