异常简介
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是显示一个提示的页面。
Python 内置了一套try...except...finally...的错误处理机制。
示例代码:
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
#执行结果
try...
except: division by zero
finally...
END
当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。
如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:
异常种类
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常实例
IndexError
# 没有异常各个代码快执行状态
a = list(range(8))
print(a)
try:
x = a[0]
print(x) # 没有异常打印这个
except IndexError as e:
print(e)
else:
print("没有异常执行这个")
finally:
print("无论有无异常都执行")
print("end")
#====执行结果====
[0, 1, 2, 3, 4, 5, 6, 7]
0
没有异常执行这个
无论有无异常都执行
end
# 有异常代码块执行状态
a = list(range(8))
print(a)
try:
x = a[10]
print(x) # 没有异常打印这个
except IndexError as e: # 捕获错误
print(e) # 打印错误
else:
print("没有异常执行这个")
finally:
print("无论有无异常都执行")
print("end")
#====执行结果====
[0, 1, 2, 3, 4, 5, 6, 7]
list index out of range
无论有无异常都执行
end
万能异常
name = "bushaoxun"
try:
int(name)
print("ok") # 捕获到错误不执行.
except Exception as e: # 万能异常,捕获各种异常
print(e)
# 执行结果
invalid literal for int() with base 10: 'bushaoxun'
主动触发异常,抛出错误
class x(ValueError): # 错误是一个类,捕获错误就是捕获类的一个实例
pass
try:
raise x("我是一个兵") # 抛出错误
except x as e:
print(e) #捕获错误
raise # raise语句如果不带参数,就会把当前错误原样向上抛出
# 执行结果
我是一个兵
Traceback (most recent call last):
File "C:/Users/bushaoxun/PycharmProjects/Learning/day2/yicang.py", line 11, in
raise x("我是一个兵") # 抛出错误
__main__.x: 我是一个兵
断言
assert 表达式 “抛出异常的值”
def foo(s):
n = int(s)
assert n != 0, 'n is zero!' # 如果 n !=0 不为真,抛出断言错误 AssertionError: n is zero!
return 10 / n
def main():
foo('0')
try:
main()
except Exception as e:
print(e)
# 执行结果
n is zero!