目录
在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,还有一类错误是完全无法在程序运行过程中预测的,调试时我们关心这些错误是什么类型的错误,在哪儿出错的,以及为什么出错。
在 Python 中,异常(Exception)是用于处理程序运行时错误的一种机制。当程序遇到错误时,它不会简单地崩溃,而是抛出一个异常对象,这允许开发者捕获并处理这些错误,从而使得程序可以处理意外情况或错误输入。
1. 异常的分类
Python 中的异常分为两大类:
- 语法错误(SyntaxError):通常出现在代码的语法不正确时,导致代码无法执行。
- 运行时错误(RuntimeError):在程序运行过程中发生的错误,程序可以被捕获并处理。
2. 常见的异常类型
SyntaxError
:语法错误。IndexError
:访问不存在的列表索引时抛出。KeyError
:访问不存在的字典键时抛出。ValueError
:传递给函数的值不合适时抛出。TypeError
:发生类型不匹配时抛出。NameError
:访问不存在的变量名时抛出。ZeroDivisionError
:除以零时抛出。FileNotFoundError
:文件操作失败时抛出。AttributeError
:访问不存在的对象属性时抛出。
3. 异常的捕获与处理
Python 提供了 try
、except
语句来捕获和处理异常。代码块中可能会引发异常的部分放在
try
语句中,异常类型放在 except
语句中。
try:
# 可能引发异常的代码
x = 1 / 0 # 这里会引发 ZeroDivisionError
except ZeroDivisionError as e:
# 捕获到 ZeroDivisionError
print("除以零错误:", e)
4. 多个异常的处理
可以使用多个 except
子句来处理不同类型的异常,或者使用一个 except
来捕获多个异常类型。
try:
# 可能引发多个不同类型异常的代码
num = int(input("请输入一个数字: ")) # 可能抛出 ValueError
result = 10 / num # 可能抛出 ZeroDivisionError
except ValueError as e:
print("输入无效,必须输入数字!")
except ZeroDivisionError as e:
print("不能除以零!")
也可以用一个 except
来捕获多个异常类型:
try:
num = int(input("请输入一个数字: "))
result = 10 / num
except (ValueError, ZeroDivisionError) as e:
print("出现错误:", e)
5. 捕获所有异常
如果希望捕获所有异常类型,可以使用
except
后不指定异常类型,或指定为
Exception
类。但这并不推荐,因为捕获所有异常可能会掩盖程序中的其他问题。
try:
x = 10 / 0
except Exception as e:
print("发生了一个错误:", e)
6. else
和 finally
块
除了 try
和
except
,Python
还支持 else
和
finally
块。
else
块:如果try
块没有抛出异常,else
块中的代码会被执行。finally
块:无论是否抛出异常,finally
块中的代码都会被执行(例如关闭文件、释放资源等)。
try:
x = 10 / 2
except ZeroDivisionError as e:
print("除以零错误:", e)
else:
print("没有异常发生,结果是", x)
finally:
print("无论如何都执行的代码")
7. 自定义异常
Python 允许开发者自定义异常类型。可以通过继承
Exception
类或者其子类来定义自己的异常。
class MyError(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
try:
raise MyError("这是一个自定义异常")
except MyError as e:
print(f"捕获到自定义异常: {e}")
8. 抛出异常
如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出,使用
raise
关键字主动抛出异常。在特定条件下触发错误,或者在处理某些特殊逻辑时非常有用。
def check_age(age):
if age < 18:
raise ValueError("年龄不能小于18岁")
else:
print("年龄符合要求")
try:
check_age(16)
except ValueError as e:
print("错误:", e)