异常机制概述
异常机制用于捕获代码执行过程可能出现的错误,以便分门别类的针对错误类型进行相应的错误处置和提示,避免程序运行的中断。同时在部分场景,可以人为的主动抛出错误,以执行我们想要进行的代码程序。
内置异常错误
NameError
:常出现于未定义的变量名称
IndexError
:常见于列表等序列索引不合法问题
SyntaxError
:语法问题出错
ZeroDivisionError
:分母为0出错
Python内置错误类型众多,详细资料请见Built-in Exceptions.
异常机制语法
try语法
try:
pass
except:
pass
工作机制
- 首先执行try代码块里的内容,如果没有发生错误,则跳过except代码块的内容;
- 如果try代码块里面发生错误,而且错误类型匹配except后面的错误类型名,则执行except代码块的内容,之后正常执行try…except内容之后所有代码,不会出现报错信息;
try:
print("1/0 = {}".format(1/0))
except:
print("除法中分母不可以为0")
print("haha")
-
如果出现未被定义的exception,则会将错误向上传递,若不匹配所有父类中的错误,则程序停止执行;
-
try后面可以跟着多个except,分别表示出现不同错误执行不同处理程序
try:
print(1/0)
except ZeroDivisionError:
print('zero is error')
except NameError:
print("the name of variable is not defined.")
try:
x = name
except ZeroDivisionError:
print('zero is error')
except NameError:
print("the name of variable is not defined.")
- 不同错误发生,也可以对应到相同的错误处理程序,即一个except后可以跟多个错误类型名,将这些错误放到一个元组中即可;
def check(flag):
try:
if(flag == 1):
print("ZeroDivisionError")
print(1/0)
elif(flag == 2):
print("NameError")
x = name
else:
print("AttributeError")
print(x.age)
except(ZeroDivisionError,NameError,AttributeError):
print("error is occuring")
for i in range(3):
check(i+1)
- try…except语句还可以加上else语句,但是else语句必须在所有except语句之后。在try代码块内没有出现错误的时候,执行else代码块里面的内容;
def check(flag):
try:
if flag == 1:
print('haha')
else:
print(1/0)
except ZeroDivisionError:
print('error is occuring.')
else:
print('the code is correct.')
for i in range(2):
check(i+1)
- except语句在异常名称后可以指定变量,该变量名指向异常实例。如果异常带有参数,则参数存储在instance.args中,同时该实例定义了
__str__
魔术方法,可以直接打印实例来查看实例携带的参数;
try:
raise ZeroDivisionError('haha', 12345)
except ZeroDivisionError as zero:
print(type(zero))
print(zero.args)
print(zero)
- try…except语句不仅仅处理直接发生的错误,在try语句中函数调用内部出现的错误也会被捕获;
- 定义清理操作,即try…except语句再加上一个
finally
语句,该代码块内容无论是否发生错误都会执行。try;except;else;finally可以同时出现,也可以有选择的出现;
def check(flag):
try:
if(flag == 1):
print("Hello World!")
elif(flag == 2):
print("The code is occuring error.")
print(1/0)
else:
raise NameError('Tom','Daming')
except ZeroDivisionError:
print('Zero is not correct.')
except NameError as na:
print("The coder raises the NameError.")
print("Carry the args:{}|{}".format(na.args[0],na.args[1]))
else: # 不发生错误时执行
print('The code is correct.')
finally: # 不管有无错误都会执行的内容
print("clean up the code")
for i in range(3):
print('*'*5+str(i+1)+'*'*5)
check(i+1)
- try语句碰到
return
continue
break
关键字,会优先执行finally语句里面的内容。
def bool_return():
try:
return True
finally:
return False
print(bool_return())
异常抛出
raise
语句允许人们主动抛出一个异常,raise后面的唯一参数必须是一个继承于类Exception
异常实例或者异常类,类作为参数传递时会隐式实例化。
raise ZeroDivisionError("error is occuring") # 括号内为显示信息