Python 篇章(十八)
Python 异常处理
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。
- 异常处理
- 断言(Assertions)
一、异常处理
1. python 异常码
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
2. try--except--else 语句
-
作用:用来检测try语句块中的错误,从而让except语句捕获错误信息并处理
-
逻辑:当 try “语句t” 执行时出现错误,会匹配第一个错误码,如果匹配的上就执行对应的“语句”;如果没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层;如果当 try “语句t” 执行时没有出现错误,执行else下的“语句e”,
-
格式:
try:
语句t
except 错误码 as e:
语句1
except 错误码 as e:
语句2
......
except 错误码 as e:
语句n
else:
语句e
- 示例
#1 使用except而不使用任何的错误类型。{这是比较常用的 ~_~ }
try:
print(4 / 0)
except:
print("这行的程序出现了错误")
else:
print("very good")
# 意思就是我不管这个程序到底出现了什么错误,只要有错误,我就print打印一个错误日志,并且让他越过这个错误继续向下执行代码
print("@@@@@@@@@@@@@@@@@")
#2 当程序遇到问题的时不让程序结束,而是越过错误继续向下执行
try:
# print(3 / 2) # 没有问题的程序
# print(3 / 0) # 错误码 ZeroDivisionError
# print(num) # 错误码 NameError
except ZeroDivisionError as a:
print("程序出现ZeroDivisionError问题")
except NameError as a:
print("程序出现NameError问题")
else:
print("very good")
print("******************")
#3 使用except带着多种异常。{与上面的意思相同,只不过就是将多个except语句简化成了一个}
try:
print(3 / 2) #没有问题的程序
# print(3 / 0) #错误码 ZeroDivisionError
# print(num) #错误码 NameError
except (ZeroDivisionError, NameError):
print("出现了ZeroDivisionError或NameError")
else:
print("very good")
print("###########################")
- 他的特殊性
错误其实就是class(类),所有的错误都继承自BaseException,所以在捕获的时候,他能捕获该自身类型的错误,也能捕获他的子类
# 代码示例1
try:
print(5 / 0) # 错误码 ZeroDivisionError
except BaseException as e:
print("“父类”错误")
except ZeroDivisionError as e:
print("“子类”错误")
# 思考:讲道理应该执行下面的(“子类”错误),但执行的确是上面的(“父类”错误);这是为什么?
# 因为BaseException错误是ZeroDivisionError错误的父类,所以BaseException错误直接继承了ZeroDivisionErro的错误
# 代码示例2
# 跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,只要main捕获到了就可以处理
def func1(num):
print(1 / num) # 1 / 0;报错:ZeroDivisionError
def func2(num):
func1(num) # 调用了func1()函数;并且把自身num的值:0传递给了func1
def main():
func2(0) # 调用了func2()函数;并且给func2传递了一个值:0
try:
main() # -->调用了main()函数
except ZeroDivisionError as e: # except程序发现有这个ZeroDivisionError错误码,执行他下方的语句,没有就执行else下的语句
print("******") # 执行完后越过错误继续向下执行
else:
print("very good") # 执行后继续向下执行
print("lemon is a handsome") # 执行完毕后退出程序
3. try--except--finally语句
- 作用:语句 t 不管有没有错误都将执行最后的语句 f
- 格式
try:
语句t
except 错误码 as e:
语句t1
except 错误码 as e:
语句t2
......
except 错误码 as e:
语句n
finally:
语句f
- 示例
try:
print(5 / 0)
except:
print("“错误”,除数不能为0")
finally:
print("不管except有没有错,都必须执行我")
二、断言
作用:
- python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。
格式:
assert expression
- 等价于:
if not expression: raise AssertionError
- assert 后面也可以紧跟参数:
assert expression [, arguments]
- 等价于:
if not expression: raise AssertionError(arguments)
示例
def func(num, div): assert (div != 0), "div不能为0" return num / div res = func(10, 0) print(res)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律