python学习之异常学习
python中常见的异常类型
1. NameError:尝试访问一个为申明的变量。
2. ZeroDivisionError:除数为零错误。
3. SyntaxError:解释器语法错误,这是一个唯一不在运行时发生的异常,在运行前解释器就会显示其错误。
4. IndexError:请求的索引超出范围。
5. KeyError:请求一个不存在的字典的关键字。
6. IOError:输入/输出错误(IO错误)。
7. AttributeError:尝试访问未知的对象属性。
8. TypeError:类型错误,参数等类型不匹配。
9. Exception:捕获所有异常。
python检测和处理异常
异常处理使用主要有两个语句
try:
pass
except 错误类型 as e:
print(e)
pass
try:
pass
finally:
pass
注意
- try中的代码发生错误抛出异常,except根据自己的异常类型判断是否捕获这个异常。一个try可以跟多个except。和C++类似,Exception异常类型可以捕获除了sys.exit()抛出的程序退出类型以外的任何异常类型。as e是产生一个异常类型的对象,然后print(e)会打印出异常类型信息。
- 如果try中代码未发生异常,就会跳过。如果try中出现异常,但是except的异常类型与异常不匹配,那么程序就会在异常语句直接挂掉
- try-finally子句,finally子句只能有一个,也可以使用try-except-finally混合语句。finally的语句无论错误是否发生都会被执行。如果是混合的话finally写在最后。
- 也可以指定确定的异常类型,因为一般代码中不同的异常可能补救处理不同,使用try和多个except即可。
- 如果对于某个类型异常你不想做处理,你可以在其except代码块中写pass即可,但是程序会报错。
异常处理中else关键字
try:
pass
except TypeError:
print("类型错误")
else:
print("else子句")
finally:
print("finally子句")
- 一个try-except-finally语句中只能有一个else,并且else必须在except后面,如果没有异常发生,也就是没有执行except那就会执行else,else必须放在except和finally中间。
异常语句可以跨层次
下一个简单的代码来说明
def func(s):
return 10 / int(s)
def help(s):
return func(s) * 10
def main():
try:
help('0')
except Exception as e:
print(e)
finally:
print("finally")
main()
""" 结果:
division by zero
finally
"""
上面的代码就实现了跨层次的捕获异常,首先func将异常抛给help然后help将异常抛给main,然后main处理异常。
主动触发异常
raise语句就是用来出动主动抛出异常的,类似于C++的throw一样,使用格式如下:
def div(a,b): # 做a/b
if b == 0:
raise ZeroDivisionError("division by error")
return a / b
自定义异常类型
自己实现一个类,然后需要继承Expection类。
class MyError(Exception):
def __init__(self,msg):
self.mymsg = msg
# 重载print函数
def __str__(self):
return self.mymsg
try:
raise MyError("my error")
except MyError:
print("MyError")
断言
和C中的assert一样,如果assert子句条件不成立就会抛出AssertionError类型的异常。否则就不做任何事。
a = 12
b = 0
assert b != 0,"division by zero"
tmp = a / b
print("end")
a=12
b=0
try:
assert b != 0,"division by zero"
tmp = a /b
except AssertionError as a:
print(a)
第一种代码程序会崩溃,并打印字符串;第二种也可以直接捕获异常。