python异常的一些说明
#python异常语法全家桶
try:
suite1
suite2
suite3
except IOError:
suite for IOError exception
except ValueError as valueErr:
suite for ValueError exception and get ValueError info with valueErr argument
except (IOError,ValueError,TypeError):
suite for (IOError,ValueError,TypeError) exception
except Exception:
suite for all Exception
else:
suite when no exception exec
finally:
always_exec_suite
python异常处理组件为 try--except--else--finally,其中else和finally是可选的,try和except是必选的,异常处理语句中至少要包含一个except
异常处理执行的流程为:
异常的示例
def testexception():
try:
with open(r'F:\pythonfiletest\testxxx','r') as test:
test.read()
except IOError as IOErr:
print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , IOErr)
else:
print("这是else,当不发生异常时,我会执行")
finally:
print("这是finally,无论是否发生异常,我都会执行")
print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")
testexception()
#输出
这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行
[Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行
首先尝试打开文件读取内容,testxxx文件并不存在,所以会产生一个IO异常。except声明捕获IO异常,打印定义好的内容,并且将系统产生的IOError错误信息一并打印。由于except语句执行了,所以else会被跳过。执行finally语句块。由于程序是”正常“结束的,所以最后的print语句也会被执行。
def testexception():
try:
with open(r'F:\pythonfiletest\testxxx','w+') as test:
test.read()
except ValueError as ValueErr:
print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
else:
print("这是else,当不发生异常时,我会执行")
finally:
print("这是finally,无论是否发生异常,我都会执行")
print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")
testexception()
#输出
这是else,当不发生异常时,我会执行
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行
调整一下语句,在不发生异常的情况下,else会被执行
def testexception():
try:
with open(r'F:\pythonfiletest\testxxx','r') as test:
test.read()
except ValueError as ValueErr:
print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
else:
print("这是else,当不发生异常时,我会执行")
finally:
print("这是finally,无论是否发生异常,我都会执行")
print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")
testexception()
#输出
这是finally,无论是否发生异常,我都会执行
Traceback (most recent call last):
File "F:/PythonProject/my_project/geektime/test.py", line 14, in <module>
testexception()
File "F:/PythonProject/my_project/geektime/test.py", line 3, in testexception
with open(r'F:\pythonfiletest\testxxx','r') as test:
FileNotFoundError: [Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'
在未进行异常处理或者没有捕获到异常时,如果程序异常则直接抛出异常并退出,用户体验就很差了。由于产生的是IOError,而声明中捕获的是ValueError,不匹配。所以except语句块没有被执行。产生了异常,else语句块没有被执行。finally总要被执行。由于异常中断了程序,最后的print语句也没有被执行。没有被捕获的异常的错误信息被抛出。
def testexception():
try:
with open(r'F:\pythonfiletest\testxxx','r') as test:
test.read()
except ValueError as ValueErr:
print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
except Exception as AllErr:
print("这是异常大管家,我捕获所有异常,如果发生异常且未被前面的except捕获,我会执行\n", AllErr)
else:
print("这是else,当不发生异常时,我会执行")
finally:
print("这是finally,无论是否发生异常,我都会执行")
print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")
testexception()
#输出
这是异常大管家,我捕获所有异常,如果发生异常且未被前面的except捕获,我会执行
[Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行
当然在捕获异常时,可以声明多个except语句或者在一个except语句中捕获多种异常,还可以使用Exception进行”兜底“,保证程序的正常执行。
def test(x):
try:
if type(x) is not int:
raise TypeError('这是我主动抛出的异常')
print(1+x)
except TypeError as TypeErr:
print("需要一个整数进行计算", TypeErr)
test(1.1)
#输出
需要一个整数进行计算 这是我主动抛出的异常
上面的示例都系统自动抛出异常,而raise允许主动抛出异常,例如该方法需要用户输入一个整数进行加法运算,如果用户输入一个浮点值用于做加法系统并不会抛出异常,会正常进行计算,但其结果已经不是我们想要的了,所以使用raise主动抛出异常,跳过try块中raise后面的语句,直接调用except返回错误提示信息。