Python 异常处理 基本概念
prit('hehe')
路径
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 3, in <module>
内容
prit('hehe')
名字:未定义名称“prit”
NameError: name 'prit' is not defined
这看起来是一个异常,其实是程序抛出的一个异常
抛出异常和编译出错
抛出异常一定是:运行时
a = [1,2,3]
print(a[100])
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 16, in <module>
print(a[100])
索引器:列表索引超出范围
IndexError: list index out of range
打开一个不存在的文件
open('aaa/bbb.txt')
Traceback (most recent call last):
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 23, in <module>
open('aaa/bbb.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'aaa/bbb.txt'
异常:程序在运行时,出错了
出错后会根据原因,来抛出什么异常
处理异常
我们使用 try 语句来捕捉异常(可能触发异常的代码放到try中). 使用except来具体处理异常.
如果异常能够被except捕捉到, 则不会影响程序继续执行.
IndexError, e相当于捕捉到的这个异常对象的名字为e. 这个异常对象中包含了异常的具体信息
except可以指定一个具体的处理哪种类型异常.
如果try中抛出的异常类型, 不在except中, 那么仍然会程序终止
try:
a = [1,2,3]
print(a[100])
except:
print('出错点')
出错点
虽然出现异常,但是我们不知道会出现什么异常?我们针对异常,应该进行那种处理
我们应该明确知道try之中的代码会抛出那些异常
再有针对性的处理
try:
a = [1,2,3]
print(a[100])
except IndexError as e:
print('出错点',e)
出错点 list index out of range
此处是 name 出错,和越界
try:
a = [1,2,3]
prit(a[100])
except IndexError as e:
print('出错点',e)
Traceback (most recent call last):
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 58, in <module>
prit(a[100])
NameError: name 'prit' is not defined
修改:
try:
a = [1,2,3]
prit(a[100])
except IndexError as e:
print('出错点',e)
except NameError as e:
print('名字出错',e)
名字出错 name 'prit' is not defined
问题,我们有两个异常,为什么只有一个异常?
当我们遇见一个异常的时候,就不会往下继续走了,
try:
a = [1,2,3]
prit(a[100])
print('hehe')
except IndexError as e:
print('出错点',e)
except NameError as e:
print('名字出错',e)
名字出错 name 'prit' is not defined
没有打印出 hehe
问题:如果这段代码不是自己写的,里面的异常我们不知道是什么?
try:
a = [1,2,3]
prit(a[100])
print('hehe')
except Exception as e:
#捕获所有异常
print('其余所有异常',e)
其余所有异常 name 'prit' is not defined
一个try语句, 还可以搭配else工作
try:
a = [1,2,3]
print(a[1])
except IndexError as e:
print('出错点',e)
except NameError as e:
print('名字出错',e)
except Exception as e:
#捕获所有异常
print('其余所有异常',e)
else:
如果try中没有抛出任何异常,就执行 else中的代码
如股票try中抛出异常,就不执行else
print("meiyouwenti")
2
meiyouwenti
如果想执行一些不管是否触发异常, 都要执行到的代码, 可以放到finally语句块中
try:
a = [1,2,3]
print(a[1])
except IndexError as e:
print('出错点',e)
except NameError as e:
print('名字出错',e)
except Exception as e:
print('其余所有异常',e)
else:
print("meiyouwenti")
finally:
就是为了做一些善后工作
你使用了一个文件,如果上面异常了,那么这个文件就会关闭不了
print('finally内容')
2
meiyouwenti
finally内容
python中变量的作用域
1.有三个关键字:def class lambda会影响变量作用域
2.其他关键字:if else while for try except
with 语句本质上就是 try 、、、 finally
抛出异常
使用 raise 关键字在代码中 "抛出异常“
我们实现一个函数做整数除法.
def Divide(x, y):
if y == 0:
raise Exception('divide zero')
return x / y
Divide(1, 0)
执行结果
Traceback (most recent call last):
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 156, in <module>
Divide(1, 0)
File "c:\Users\wyw15\Desktop\python代码\testpython_5\test.py", line 154, in Divide
raise Exception('divide zero')
Exception: divide zero
手动抛出,手动捕获
def Divide(x, y):
if y == 0:
raise Exception('被除数为零')
return x / y
try:
Divide(1,0)
except Exception as e:
print(e)
SyntaxError: invalid syntax
被除数为零
我们尽量不要使用Exception
我们此处的异常是:ZeroDivisionError
除(或取模)零(所有数据类型)
def Divide(x, y):
if y == 0:
raise ZeroDivisionError('被除数为零')
return x / y
try:
Divide(1,0)
except ZeroDivisionError as e:
print(e)
被除数为零