1.1 异常处理
有时可将程序错误(Error)称作程序异常(Exception)。
- 出现错误程序终止。
- 出现异常程序终止,也可以捕捉异常和撰写异常处理程序,处理完程序可以继续运行。
1.1.1 除数为0的异常
>>> 3 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
程序终止,打印出现异常的信息(除0错误)
1.1.2 异常处理程序
try:
指令 # 可能发出异常
except [异常类型]:
异常处理程序
执行过程:
- try代码块:指令可能会抛出异常
- except代码块:每个try可以跟多个except代码块,用于处理所有可能抛出的异常。异常如果省略了类型,则会捕捉所有的异常,如果指定异常类型,则会捕捉该类型异常及子类异常。
def division(x,y):
try:
return x / y
except ZeroDivisionError:
print("除数不能为零")
except TypeError as e: # 异常对象
print(e)
division(3,0) # 除数不能为零
division("a","b") # unsupported operand type(s) for /: 'str' and 'str'\
except 后面可以写成as 异常对象名的方式,之后处理时可输出异常对象的信息。
1.1.3 try - except - else
try:
...
except 异常对象:
...
else:
没有发生异常时执行这个代码块。
filename = "d:/2txt"
try:
with open(filename) as fp:
data = fp.read()
except FileNotFoundError:
print("未找到文件:{}".format(filename))
else:
print(data)
如果找到文件了,读取数据并显示,未找到打印未找到。
1.2 常见的异常对象
异常类型 | 说明 |
---|---|
AttributeError | 对象没有这个属性( |
Exception | 通用异常父类,它的父类是BaseException |
FileNotFoundError | 打不到文件 |
IOError | 在输入输出时发生错误 |
IndexError | 下标越界 |
KeyError | 在映射中没有这个键 |
MemoryError | 请求内存出错 |
NameError | 对象名称未声明 |
SyntaxError | 语法错误 |
SystemError | 系统错误 |
TypeError | 数据类型错误 |
ValueError | 传入无效参数 |
ZeroDivisionError | 除数为0 |
1.3 多重捕获
try:
...
except 异常对象1:
...
except 异常对象2:
...
except可以是多个。注意:如果有父子关系的异常,要子类异常在前,父类异常在后,否则子类异常永远不会捕获到异常。
多重捕获多个异常的另一种方法:
try:
...
except(异常类型1, 异常类型2, ...):
...
如:
def f(a, b):
try:
return a / b
except(ZeroDivisionError, TypeError) as e:
print(e)
f(3, 0)
f(3, "a")
1.4 捕获所有异常
try:
...
except:
...
except后面没有跟任意类型。
1.5 抛出自定义的异常
raise Exception("异常信息")
class LoginError(Exception):
def __init__(self, message):
super().__init__(message)
def login(username, password):
if username == 'admin' and password == 'admin':
return True
else:
raise LoginError("用户名或密码错误") # 抛出异常信息
try:
login("admin","admin")
except LoginError as e:
print(e)
else:
print("登录成功")
1.6 异常堆栈跟踪信息
出现错误时会显示堆栈信息,定位错误文件及原因,可以把这个信息写入文件中。
traceback.format_exc() # 打印出错信息
try:
raise Exception("出错啦!")
except Exception as e:
print(e) # 出错啦!
# 打印:出错啦!
import traceback
try:
raise Exception("出错啦!")
except Exception as e:
traceback.print_exc() # 打印堆栈信息
'''
Traceback (most recent call last):
File "D:\develop\school\main.py", line 4, in <module>
raise Exception("出错啦!")
Exception: 出错啦!
'''
可以把这个信息写入文件 , 用traceback.format_exc()
返回信息
import traceback
try:
raise Exception("出错啦!")
except Exception as e:
with open("d:/err.txt", "a") as f:
f.write(traceback.format_exc())
1.7 资源释放
try:
...
except [异常类型n]:
...
finally:
...
finally必须放在最后,无论是否发生异常都会执行。
对于有些编程需要手动释放资源的,可以放在这里。
1.8 自定义异常类
class 异常类名(Exception):
def __init__(self, message):
super().__init__(message)
1.9 断言
断言用于程序的调试,使用的很少。
assert 表达式 , '断言信息'
如果表达的值为False,则抛出断言信息,相当于 raise AssertionError('error')
a = 0
assert a > 0, "a不能小于0"
'''
Traceback (most recent call last):
File "D:\develop\school\main.py", line 2, in <module>
assert a > 0, "a不能小于0"
AssertionError: a不能小于0
'''
标签:...,Exception,PYTHON,except,try,处理,print,异常
From: https://www.cnblogs.com/three-sheep/p/16968551.html