print("1---------------------")
open("123.txt","r")
print("2---------------------")
运行结果为:
1---------------------
Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 2, in <module>
open("123.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
说明:打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)
异常:当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的”异常”
try…except…
try:
print("1---------------------")
open("123.txt","r")
print("2---------------------")
except IOError:
pass
运行结果为:1---------------------
说明:
try:
print(num)
except IOError:
print("产生的错误")
运行结果为:
Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 2, in <module>
print(num)
NameError: name 'num' is not defined
上例程序,已经使用except来捕获异常了,为什么还会看到错误的信息提示?因为:except捕获的错误类型是IOError,而此时程序产生的异常为 NameError ,所以except没有生效
修改后的代码为:
try:
print(num)
except NameError:
print("产生的错误")
运行结果为:产生的错误
实际开发中,捕获多个异常的方式,如下:
try:
print("1---------------------")
open("123.txt","r")
print("2---------------------")
print(num)
except (IOError,NameError):
print("产生的错误")
运行结果为:
1---------------------
产生的错误
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
try:
print("1---------------------")
open("123.txt","r")
print("2---------------------")
except Exception as e:#Exception是异常类,e是捕获到的异常
print(e)
运行结果为:
1---------------------
[Errno 2] No such file or directory: '123.txt'
在if中,else的作用是当条件不满足时执行的实行;同样在try…except…中也是如此,即如果没有捕获到异常,那么就执行else中的事情
try:
num = 100
except Exception as e:#Exception是异常类,e是捕获到的异常
print("产生错位了:%s"%e)
else:
print("没有捕获异常,真高兴")
运行结果为:没有捕获异常,真高兴
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
import time
try:
f = open("test.txt")
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except :
#如果再读取文件的过程中,产生了异常,那么就会捕获到
#比如 按下 ctrl + c
pass
finally:
f.close()
print("关闭文件")
except :
print("没有这个文件")
test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。
我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。
def test1():
print("------test1-1-------")
print(num)
print("------test1-2-------")
def test2():
print("------test2-1-------")
test1()
print("------test2-2-------")
def test3():
try:
print("------test3-1-------")
test1()
print("------test3-2-------")
except Exception as e:
print("捕获到了异常,信息是:%s"%e)
test3()
print("--------------------------------------")
test2()
运行结果为:
------test3-1-------
------test1-1-------
捕获到了异常,信息是:name 'num' is not defined
--------------------------------------
------test2-1-------
------test1-1-------
Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 21, in <module>
test2()
File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 8, in test2
test1()
File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 3, in test1
print(num)
NameError: name 'num' is not defined
用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
class ShortInputException(Exception):
def __init__(self,length,atleast):
self.length = length
self.atleast = atleast
def main():
try:
s = input("请输入:")
if len(s)<3:
raise ShortInputException(len(s),3)
except ShortInputException as e:
print("ShortInputException:输入的长度是%d,长度至少是%d"%(e.length,e.atleast))
else:
print("没有发生异常")
main()
运行结果为:
请输入:qw
ShortInputException:输入的长度是2,长度至少是3
请输入:qwert
没有发生异常