文章目录
前言
本文为7月5日Python基础学习笔记,分为六个章节:
- 异常(Exception)的本质;
- try_except:基本结构、try_多个except 结构、try_except_else 结构、try_except_finally 结构;
- 常见异常汇总和说明;
- _with 上下文管理;
- _traceback 模块的使用;
- _raise 自定义异常类。
一、异常(Exception)的本质
- 异常处理机制示意代码如下:
try:
copyFlie("d:/a.txt", "e:/a.txt")
except:
print("文件无法拷贝")
- 内建异常类的继承层次:
二、try_except
1、try_except 基本结构
执行的时候,
- 如果 try 块中没有引发异常,则跳过 except 块继续执行后续代码;
- 如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常。 异常处理完后,继续执行后续代码。
try:
print("step1")
a = 3/0
print("step2") # a = 3/0 报错,跳过该行
except BaseException as e:
print("step3")
print(e)
print("step4")
>>> step1
>>> step3
>>> division by zero
>>> step4
- 循环输入数字,如果不是数字则处理异常;直到输入 88,则结束:
while True:
try:
x = int(input("请输入一个数字:"))
print("输入的数字是:", x)
if x == 88:
print("退出程序")
break
except:
print("异常:输入格式错误")
>>> 请输入一个数字:10
>>> 输入的数字是: 10
>>> 请输入一个数字:20
>>> 输入的数字是: 20
>>> 请输入一个数字:dd
>>> 异常:输入格式错误
>>> 请输入一个数字:88
>>> 输入的数字是: 88
>>> 退出程序
2、try_多个except 结构
尽量捕获可能出现的多个异常**(按照先子类后父类的顺序)**,并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException。
try:
a = input("输入被除数:")
b = input("输入除数:")
c = float(a) / float(b)
print(c)
except ZeroDivisionError:
print("异常:除数不能为 0")
except TypeError:
print("异常:除数和被除数都应为数值类型")
except NameError:
print("异常:变量不存在")
except BaseException as e:
print(e)
print(type(e))
>>> 输入被除数:10
>>> 输入除数:1
>>> 10.0
3、try_except_else 结构
- try 块中没有抛出异常,则执行 else 块;
- try 块中抛出异常,则执行 except 块,不执行 else 块。
try:
a = input("输入被除数:")
b = input("输入除数:")
c = float(a) / float(b)
except BaseException as e:
print(e)
else:
print("结果为:", c)
>>> 输入被除数:10
>>> 输入除数:0
>>> float division by zero
>>> 输入被除数:10
>>> 输入除数:2
>>> 结果为: 5.0
4、try_except_finally 结构
- finally 块无论是否发生异常都会被执行,通常用来释放 try 块中申请的资源
try:
a = input("输入被除数:")
b = input("输入除数:")
c = float(a) / float(b)
except BaseException as e:
print(e)
else:
print("结果为:", c)
finally:
print("finally 语句,无论是否发生,都执行")
print("程序结束!")
>>> 输入被除数:10
>>> 输入除数:0
>>> float division by zero
>>> finally 语句,无论是否发生,都执行
>>> 程序结束!
三、常见异常汇总和说明
异常名称 | 说明 |
---|---|
ArithmeticError | 所有数值计算错误的基类 |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvironmentError | 操作系统错误的基类 |
EOFError | 没有内建输入,到达 EOF 标记 |
Exception | 常规错误的基类 |
FloatingPointError | 浮点计算错误 |
FutureWarning | 关于构造将来语义会有改变的警告 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
ImportError | 导入模块/对象失败 |
IndentationError | 缩进错误 |
IndexError | 序列中没有此索引(index) |
IOError | 输入/输出操作失败 |
KeyboardInterrupt | 用户中断执行 |
KeyError | 映射中没有这个键 |
LookupError | 无效数据查询的基类 |
MemoryError | 内存溢出错误 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统错误 |
OverflowError | 数值运算超出最大限制 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
StandardError | 所有的内建标准异常的基类 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python 语法错误 |
SyntaxWarning | 可疑的语法的警告 |
SystemError | 一般的解释器系统错误 |
SystemExit | 解释器请求退出 |
TabError | Tab 和空格混用 |
TypeError | 对类型无效的操作 |
UnboundLocalError | 访问未初始化的本地变量 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeTranslateError | Unicode 转换时错误 |
UserWarning | 用户代码生成的警告 |
ValueError | 传入无效的参数 |
WindowsError | 系统调用失败 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
四、_with 上下文管理
- with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的现场或上下文。
with open("D:/learning_materials/Python_fundations/a.txt") as f:
for line in f:
print(line)
>>> xiaoli
>>> SANY
>>> Electrial tractor
五、_traceback 模块的使用
- 使用 Traceback 模块打印异常:
# coding=utf-8
import traceback
try:
print("step1")
num = 1/0
except:
traceback.print_exc()
>>> step1
>>> Traceback (most recent call last):
File "D:\learning_materials\jupyternotebook_projects\my_exception\test_traceback.py", line 8, in <module>
num = 1/0
ZeroDivisionError: division by zero
- 使用 Traceback 将异常信息写入日志文件:
# coding=utf-8
import traceback
try:
print("step1")
num = 1/0
except:
with open("D:/learning_materials/Python_fundations/a.txt", 'r+') as f:
traceback.print_exc(file=f)
>>> Traceback (most recent call last):
>>> File "D:\learning_materials\jupyternotebook_projects\my_exception\traceback_02.py", line 7, in <module>
num = 1/0
>>> ZeroDivisionError: division by zero
六、_raise 自定义异常类
- 程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类;
- 自定义异常由 raise 语句主动抛出。
# coding=utf-8
class AgeError(Exception): # 继承 Exception
def __init__(self, errorInfo):
Exception.__init__(self)
self.erroInfo = errorInfo
def __str__(self):
return str(self.erroInfo) + ", 年龄错误!"
#############测试代码#################
if __name__ == "__main__": # 如果为 True,则模块作为独立文件运行,可以执行测试代码
age = int(input("输入年龄:"))
if age<1 or age>150:
raise AgeError(age)
else:
print("正常的年龄:", age)
>>> 输入年龄:500
>>> Traceback (most recent call last):
File "D:\learning_materials\jupyternotebook_projects\my_exception\__raise__.py", line 15, in <module>
raise AgeError(age)
__main__.AgeError: 500, 年龄错误!