别问我为什么又鸽了,要怪就怪“大黑山艺术体育学院”吧。今天学习如何处理异常。
raise语句
可以使用raise语句引发异常:
raise Exception
关于异常类,请参考python官方给出的文档:https://docs.python.org/zh-cn/3.7/library/exceptions.html。我们也可以自定义异常类:
class Error(Exception): pass
捕获异常
例如当除法运算时,除数为0,解释器会报错,不过我们可以这样写:
try:
a=2
b=0
print(a/b)
except ZeroDivisionError:
print("除数不能为0")
不过使用if语句貌似更好些,但如果有多个出发运算,需要多个if,但仅需一条try/except。我们可以把try/expect写入类中进行判断,还可以设计一个开关。
class su:
m=True
def cl(self,exp):
try:
return eval(exp)
except ZeroDivisionError:
if self.m:
print("除数不能为0")
else:
raise
a=su()
c=2
b=0
print(a.cl("c/b"))
a.m=0
print(a.cl("c/b"))
当except的语句仍然错误是,解释器会把上下两条错误报告同时输出。
因为一种except只能检测一种类型错误,所以我们可以使用多个except,我们也可以在元组中把错误类型存起来:
try:
someone
except ERROR1
except (ERROR2,ERROR3)
我们也可以记录错误类型然后打印:
class su:
m=True
def cl(self,exp):
try:
return eval(exp)
except ZeroDivisionError as e:
if self.m:
print("除数不能为0",e)
else:
raise
a=su()
c=2
b=0
print(a.cl("c/b"))
我们也可以不加错误参数,这将略过所有的错误。
也可以在except后加else语句,当无错误时执行else下的代码。
最后,还有finally语句。无论怎样,都将执行finally下的代码。
我们可以把try/expect嵌套在函数中,错误会进行传递。有的时候合理运用try/expect比if效率更高。例如,假设有一个字典,指定存在的键时打印相应的值,否则什么也不做。我们如果用if必须检测一次,查找一次。但我们可以假设这个键在字典里,使用try/expect,如果报错则直接pass。
警告
警告在warnings模块中,被视为报错,详情可以翻阅该模块的手册,此处暂不详细研究。