4.1 异常处理
4.1 异常处理
4.1.1 什么是异常
异常就是程序运行时发生错误的信号
iuerhfi
#输出
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[1], line 1
----> 1 iuerhfi
NameError: name 'iuerhfi' is not defined
#解读
Traceback:异常的追踪信息
NameError:name 'iuerhfi' is not defined
其中'NameError'是异常类,'name 'iuerhfi' is not defined'是异常值。
- 举栗子
try:
1/0
except:
print('error')
#输出
error
- (重点)Exception 万能异常(除了语法错误)
try:
# 1/0
dic=dict()
dic['a']
except Exception as e:
print(e) #打印异常
#语法错误无法通过try检测
以下仅为了解即可
1. 语法错误
在程序执行前发现并改正。
例如:符号丢失,关键字错误等。
#### 2. 逻辑错误
(1) TypeError: int类型不可迭代
for i in 2:
pass
(2) ValueError
x=input() #输入字符型
int(x)
(3) NameError
iuerhfi
(4)IndexError
list=['a','b']
list[3]
(5) KeyError
dic={'name':'coco'}
dic['age']
(6)AttributeError
class A:pass
A.x #属性错误
(7) ZeroDivisionError #无法完成计算
n=1/0
n=1+'dfg'
4.1.2 异常种类
在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误。
1. 常用异常
(1) AttributeError 试图访问一个对象没有的属性,比如A.x,但是A没有属性x
(2) IOError 输入/输出异常;基本上是无法打开文件
(3) ImportError 无法引入模块或包;基本上是路径问题或名称错误
(4) IndentationError 语法错误(的子类) ;代码没有正确对齐
(5) IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
(5) KeyError 试图访问字典里不存在的键
(7) KeyboardInterrupt Ctrl+C被按下
(8) NameError 使用一个还未被赋值的变量
(9) SyntaxError Python代码非法,代码不能编译
(10) TypeError 传入对象类型与要求的不符合
(11) UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
(12) ValueError 传入一个调用者不期望的值,即使值的类型是正确的
4.1.3 异常处理
保证程序的健壮性与容错性
-
提前预防
错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防 -
之后预防
#基本语法为
try:
#被检测的代码块
except #异常类型 :
# try中一旦检测到异常,就执行这个位置的逻辑
Cell In[2], line 4
except #异常类型 :
^
IndentationError: expected an indented block after 'try' statement on line 2
(1)异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
name = 'coco'
try:
int(name) #这是ValueError
except IndexError as e: # 未捕获到异常,程序直接报错
print(e)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[1], line 3
1 s1 = 'hello'
2 try:
----> 3 int(s1)
4 except IndexError as e: # 未捕获到异常,程序直接报错
5 print(e)
ValueError: invalid literal for int() with base 10: 'hello'
(2)多分支
对于不同的异常我们需要定制不同的处理逻辑
name = 'coco'
try:
int(name)
except IndexError as e:
print('IndexError:',e)
except KeyError as e:
print('KeyError:',e)
except ValueError as e:
print('ValueError:',e)
ValueError: invalid literal for int() with base 10: 'hello'
(3)万能异常Exception
无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理
name = 'coco'
try:
int(name)
except Exception as e:
print(e)
invalid literal for int() with base 10: 'hello'
(4)也可以在多分支后来一个Exception
name = 'coco'
try:
int(name)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e)
invalid literal for int() with base 10: 'hello'
(5)异常的最终执行
name='coco'
try:
int(name)
# f=open(filename)
except IndexError as e:
print(e)
except KeyError as e :
print(e)
except ValueError as e:
print(e)
else :
print('try代码块没有异常') #有异常则不执行
finally:
print('无论是否有异常,都会执行该模块') #通常是清理工作
# f.close() #用不到,都使用with open
invalid literal for int() with base 10: 'coco'
无论是否有异常,都会执行该模块
- raise()主动抛出异常 & assert断言 (不推荐使用)
#raise
try:
raise NameError('sigdfys')
except NameError as e:
print(NameError)
#assert
assert 1==1 #执行
assert 1!=1 #报错,断言失败
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[1], line 3
1 #assert
2 assert 1==1 #执行
----> 3 assert 1!=1
AssertionError:
x=10
y=x+10
assert y==20
浙公网安备 33010602011771号