常见异常汇总
异常名称 | 说明 |
---|---|
ArithmeticError | 所有数值计算错误的基类 |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvironmentError | 操作系统错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
Exception | 常规错误的基类 |
FloatingPointError | 浮点计算错误 |
FutureWarning | 关于构造将来语义会有改变的警告 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
ImportError | 导入模块/对象失败 |
IndentationError | 缩进错误 |
IndexError | 序列中没有此索引(index) |
IOError | 输入/输出操作失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
KeyError | 映射中没有这个键 |
LookupError | 无效数据查询的基类 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象(没有属性) |
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 | 传入无效的参数 |
Warning | 警告的基类 |
WindowsError | 系统调用失败 |
ZeroDivisionError | 除(或取模)零(所有数据类型) |
- 常见异常
- SyntaxError:语法错误
int a = 3 # python 变量无需声明数据类型,语法错误
- NameError:尝试访问一个没有申明的变量
print(a) # 变量a为定义
- ZeroDivisionError:除数为0 错误(零除错误)
a = 3/0 # 分母不能为零
- ValueError:数值错误
float("gaoqi") # 字符串无法转换成浮点数
- TypeError:类型错误
123 +'abc' # 整数型与字符串型无法执行加运算
- AttributeError:访问对象不存在的属性
a=100
a.sayhi() # 对象未定义属性sayhi
- IndexError:索引越界异常
a = [4,5,6]
a[10] # 切片索引超出列表长度-1
- KeyError:字典的关键字不存在
a = {'name':"gaoqi",'age':18}
a['salary'] # 字典a中,salary键不存在
with 上下文管理
try…except…finally时,不论是否发生异常都会执行finally块,finally块用于放释放资源。通过with 上下文管理,可以更方便的实现释放资源的操作。with 上下文管理的语法结构如下:
with context_expr [ as var]:
语句块
with 上下文管理可以自动管理资源,在with 代码块执行完毕后,自动还原进入该代码之前的现场或上下文。不论何种原因跳出with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。
# with 上下文管理文件操作
with open("d:/a.txt", 'r') as f: # with 不能取代try...except...finally结构,只能作为补充,方便文件管理与网络通信时的开发
content = f.readline()
print(content)
print("step4") # with块执行完毕后会自动关闭打开文件
trackback 模块
- traceback.print_exc()可以显示异常信息,便于定位异常。
# 使用Traceback 模块打印异常信息
import traceback
try:
print("step1")
num = 1 / 0
except:
traceback.print_exc()
print("step2")
运行结果:
step1
step2
Traceback (most recent call last):
File “E:/working/Pycharm_project/Python_primary/Day_17/traceback.py”, line 20, in
num = 1 / 0
ZeroDivisionError: division by zero
- 使用traceback 将异常信息写入日志文件,便于后台运行时在文件中记录错误行和异常详情,后续按报错文件定位异常。
# 使用traceback 将异常信息写入日志文件
import traceback
try:
print("step1")
num = 1/0
except:
with open("d:/a.log","a") as f: # a--append,在文件后续新增;w--write,对文件进行重写
traceback.print_exc(file=f) # 将异常详情写入日志,方便查询和定位异常
自定义异常类
程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承Exception 或其子类即可。命名格式一般以Error、Exception 为后缀,自定义异常由raise 语句主动抛出。
“__name__”是Python的内置变量,用于指代当前模块。当哪个模块被直接执行时,该模块“__name__”的值就是“__main__”,当被导入另一模块时,“__name__”的值就是模块的真实名称。所以,当运行“if __name__==’__main__’:”语句时,如果当前模块时被直接执行,__name__的值就是__main__,条件判断的结果为True,“if __name__==’__main__’:”下面的代码块就会被执行。
# 测试自定义异常类
class AgeError(Exception): # 继承Exception
def __init__(self, errorInfo): # 重新定义初始函数
Exception.__init__(self) # 引用父类初始函数
self.errorInfo = errorInfo
def __str__(self): # 报错时自动展示return内容
return str(self.errorInfo) + ",年龄错误!应该在0-150 之间"
# 自定义异常测试代码
if __name__ == "__main__": # 如果为True,则模块是作为独立文件运行,可以执行测试代码
age = int(input("输入一个年龄:"))
if age < 1 or age > 150:
raise AgeError(age) # raise抛出异常
else:
print("录入年龄为:", age)
Pycharm 开发环境的调试
中文名称 | 英文名称 | 图标和快捷键 | 说明 |
---|---|---|---|
单步调试:遇到函数跳过 | step over | F8 | 若当前执行的是一个函数,则会把这个函数当做整体一步执行完。不会进入这个函数内部 |
单步调试:遇到函数进入 | step into | F7 | 若当前执行的是一个函数,则会进入这个函数内部 |
跳出函数 | step out | Shift+F8 | 当单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函数 |
执行的光标处 | run to cursor | Alt+F9 | 一直执行,到光标处停止,用在循环内部时,点击一次就执行一个循环 |