参考了《Python3从入门到实战》这本书
Python中的异常模块
- 参考了《Python3从入门到实战》这本书
- 一、基本框架
-
-
-
-
- @注:编写程序的时候,如果知道某段代码可能会引起异常,而又不希望程序以堆栈跟踪的方式终止,就需要编写异常处理的程序代码。
- @可以通过try/except或者try/finally语句(或者他们的组合)对出现的异常进行处理,如果异常得到了处理,那么程序就可以进行下去
- @基本形式是:try...except 程序块,将可能引起异常的代码放在try子句(程序块)中,如果try子句完成后没有异常发生,就会忽略except程序块(也称except子句)继续执行后面代码。如果try子句中代码执行时出现了错误而抛出异常,except程序块(子句)会处理出现的异常,一旦异常被except子句处理完,程序就会从try...except语句后面继续执行下去。
-
-
-
- 二、捕获特定的异常
- 三、异常捕获的顺序
- 四、finally子句
- 五、抛出异常
- 六、自定义异常
- 七、断言
- 总结:异常模块在程序中还是经常使用的,有的时候,我们不知道代码在哪里可能会出现异常,万一没有捕获的话,有可能会造成一定损失,而异常模块就减小甚至避免了这些损失。
一、基本框架
@注:编写程序的时候,如果知道某段代码可能会引起异常,而又不希望程序以堆栈跟踪的方式终止,就需要编写异常处理的程序代码。
@可以通过try/except或者try/finally语句(或者他们的组合)对出现的异常进行处理,如果异常得到了处理,那么程序就可以进行下去
#模式:
try...except...
try...except...else
try...except...else...finally
try...except...except...else...finally
try...finally
@基本形式是:try…except 程序块,将可能引起异常的代码放在try子句(程序块)中,如果try子句完成后没有异常发生,就会忽略except程序块(也称except子句)继续执行后面代码。如果try子句中代码执行时出现了错误而抛出异常,except程序块(子句)会处理出现的异常,一旦异常被except子句处理完,程序就会从try…except语句后面继续执行下去。
try:
x = int(input('Enter x '))#输入数并进行强制类型转换
y = int(input('Enter y '))
print(x/y)#除数不能为0
print('x/y结果正常')
except:
print("出现了异常!")
运行结果如下:
Enter x 0
Enter y 1
0.0
x/y结果正常
----------------------(再运行一次)------------------------------------
Enter x 1
Enter y 0
出现了异常!
二、捕获特定的异常
except子句可以捕获try块里面抛出的任何类型的异常。有时,可能需要根据不同类型的异常做不同处理,即在except关键字后面说明具体的异常名字。可以用as给这个类型的异常对象起一个名字。
try:
x = int(input("输入x"))
y = int(input("输入y"))
print(x/y)
print('x/y结果正常')
except ZeroDivisionError as e:#关于这个异常的名字可以通过解释器终止程序执行
print("除数不能为0!!!!!!")#的时候看一看是由于什么异常导致的。
except ValueError as e:
print("输入类型错误!!!!!")
运行结果如下:
输入x1
输入y0
除数不能为0!!!!!!
----------------------------(再运行一次)----------------------------
输入xasd
输入类型错误!!!!!
三、异常捕获的顺序
@当try子句抛出一个异常时,就根据该异常的类型按照从上到下的次序寻找匹配的异常处理子句。因此特殊的异常应该在前面,更一般的异常要放在后面。因为如果更一般的异常先被处理后,后面的特殊异常就不会被处理了。
@捕获位置的内置异常:最后一个except子句捕获BaseException类型的异常,就能够捕获所有的异常了。由于Exception是大部分异常的父类,通常情况下也可以用Exception代替BaseException。
@可以在最后的except子句的后面加一个else子句,当没有异常发生时,会自动执行else子句,但如果发生了异常,就不会执行。
try:
x = int(input("输入x"))
y = int(input("输入y"))
print(x/y)
print('x/y结果正常')
except ZeroDivisionError as e:
print("除数不能为0!!!!!!")
except Exception as e:
print("我也不知道是什么错误!!!!!")
else:
print("没有任何异常")
运行结果如下:
输入xqwewq
我也不知道是什么错误!!!!!
输入x1 #注意这里我没有打空格,是输入x=1,y=2。
输入y2
0.5
x/y结果正常
没有任何异常
四、finally子句
@无论有没有异常出现都将会被执行,如果出现了异常,但还没有处理,则当finally中的所有代码都执行完毕后,会继续向上一层的调用函数抛出这个异常,直到这个这个异常在某一层得到了处理,程序才会继续执行下去,或者一直没有处理这个异常,程序就会终止
#写了三个try语句 帮助理解
try:
x = 1/1
print(x)
finally:
print("永远执行:")
print ("-"*60)#分隔
try:
x = 1/0
print(x)
except Exception as e:
print("除数不能为0")#错误能被处理,后执行了finally语句
finally:
print("永远执行:")
print ("-"*60)#分隔
try:
x = 1/0
print(x)
finally:
print("永远执行:")#先执行了finally语句
运行结果如下:
1.0
永远执行:
------------------------------------------------------------
除数不能为0
永远执行:
------------------------------------------------------------
永远执行:
Traceback (most recent call last):
File "E:\软件人\pkg02\数据分析.py", line 28, in <module>
x = 1/0
ZeroDivisionError: division by zero
@finally子句主要用于做一些清理工作,如释放外部资源,(文件或网络连接),无论他们在使用过程中是否出错
五、抛出异常
@用raise抛出异常:python解释器在运行时可以自动抛出异常,程序猿可以在任何代码处用raise抛出异常
try:
score = float(input('输入分数:'))#强制类型转换
if score < 0:
raise ValueError("输入错误!!!")#抛出异常
except ValueError as e:#捕获异常
print(e)
运行结果如下:
输入分数:-1
输入错误!!!
六、自定义异常
@测试自己定义的异常类
class MyError(Exception):#继承Exception
def __init__(self,value):
self.value = value
try:
raise MyError("我自己定义的异常")
except MyError as e:
print(e)#打印出参数value的值
运行结果如下:
我自己定义的异常
自定义异常一般包含以下内容:
1.自定义异常的代码
2.自定义异常的问题提示
3.自定义发生异常的行数
七、断言
@使用断言(assert)来检查某个条件或结果,断言用于判断一个表达式的值是否为True,如果断言失败,则assert语句本身就会抛出AssertionError。还可以在断言的后面用逗号跟一个表达式,如果断言失败,则输出这个表达式的值
@python解释器执行一个程序时,设置-o选项关闭调试模式,以优化模式执行程序.
try:
assert(1+1 == 2)
assert(1+1 == 3),'1+1 == 3不成立'
except AssertionError as e:#捕获信息
print(e)
print("-"*60)
assert(1+1 == 2)
assert(1+1 == 3),'1+1 == 3不成立'
运行结果如下:
1+1 == 3不成立#这是一开始用except捕获的结果
------------------------------------------------------------
Traceback (most recent call last):
File "E:\软件人\pkg02\数据分析.py", line 18, in <module>
assert(1+1 == 3),'1+1 == 3不成立'
AssertionError: 1+1 == 3不成立