目录
前言
在 Python 中,异常处理是通过 try-except
语句来实现的,用于捕获和处理程序运行时可能发生的异常情况,以防止程序终止或崩溃。
一、错误类型
Python中的错误可以分为两种:
- 语法错误(Syntax errors) :代码编译时的错误,不符合Python语言规则的代码会停止编译并返回 错误信息
- 异常(Exceptions) :相较于语法错误,异常比较难发现,因为它只在代码运行时才会发生, 如类型错误、数值错误、索引错误和属性错误等
python中的异常类层级:
1.语法错误
- 缺少起始符号或结尾符号(括号、引号等)
- 缩进错误
- 关键词拼写错误
2.异常错误
六种典型的异常:
- 除零错误(ZeroDivisionError):除数为0
- 名称错误(NameError):变量使用前未进行申明或者初始化
- 类型错误(TypeError):某些函数或者方法只适用于特定的数据类型,如果 对数据类型的操作不当,就会产生类型错误
- 数值错误(ValueError):在输入类型正确的情况下,具体输入值错误
- 索引错误(IndexError):超出序列长度的索引操作
- 属性错误(AttributeError):方法或者属性不适用该对象
二、捕获异常
高级语言通常都内置了一套错误处理机制
Python也不例外 在Python中可通过try...except...else...finally...机制捕获异常并进行处理
处理流程图:
代码实例:
li = [3, 2, 4, 1, 3, 2]
try:
# 里面放我觉得可能会出错的代码块
li[6]
except Exception as e:
# 出错之后你怎么处理? 略过 要么就是 打印错误
print(e)
else:
# 这里执行如果try的代码块没有出错才会执行
print("try 代码块没有错误")
finally:
# 这里的代码放try except 不管什么样的结果它都会执行
print("这句话必选打出来")
输出:
在这段代码中 except 后用 Exception 捕获异常并判断类型然后赋值给e。使用 Exception 可以捕获几乎所有常见的异常,因为大多数内置异常类都是 Exception 的子类或者间接子类。
list index out of range
这句话必选打出来
三、抛出异常
当我们需要在程序中手动抛出一个异常时,可以使用 raise
语句。下面是一个简单的例子,演示如何定义一个函数,当给定的参数不符合预期时抛出一个自定义异常:
def divide_numbers(a, b):
if b == 0:
raise ValueError("除数不能为零!") # 手动抛出一个 ValueError 异常
return a / b
# 示例调用
try:
result = divide_numbers(10, 0) # 这里会抛出 ValueError 异常
except ValueError as e:
print("Error occurred:", e)
输出:
Error occurred: 除数不能为零!
这样的手动抛出异常适用于需要明确告知调用者发生了什么错误,并且需要中断当前操作的情况。
四、自定义异常
在Python中可以通过创建一个新的异常类来拥有自己的异常
自定义异常的原因
- Python提供的内建异常不够用
- 可以预估某个错误的产生
定义异常类
- 异常类继承自 Exception 类,可以直接继承,或者间接继承
代码实例:
这段代码演示了如何定义一个自定义异常类 MyError
,以及如何在特定条件下抛出这个自定义异常。
异常抛出和处理流程:
- 当列表中的某个元素
i
被用于计算100 / i
时,如果结果v
小于 0,则会触发异常。 - 异常被抛出后,程序将停止执行当前循环和后续代码,并开始寻找匹配的异常处理器(
try
块的except
子句)来处理这个异常。
class MyError(Exception):
pass
li1 = [213, 43213, -312, 3412, 41, 313]
for i in li1:
v = 100 / i
print(v)
if v < 0:
# 抛出异常
raise MyError("这批货有问题,纯度不够")
输出:
0.4694835680751174
0.0023141184365815842
-0.32051282051282054
Traceback (most recent call last):
File "D:\Code\Try\HomeWork3.py", line 183, in <module>
raise MyError("这批货有问题,纯度不够")
MyError: 这批货有问题,纯度不够