1. 异常的基本概念
- 异常(Exception):在程序执行过程中,遇到非正常的或不可预见的状况(如除以零、文件不存在等),导致程序无法按照预期继续执行时,Python会抛出一个异常。
- 抛出异常(Raise):当Python解释器检测到错误时,它会抛出一个异常。此外,开发者也可以使用
raise
语句手动抛出异常。 - 捕获异常(Catch):使用
try...except
语句块可以捕获并处理异常。try
块中放置可能引发异常的代码,except
块则用于处理这些异常。
2. 常见的异常类型
Python定义了一系列标准异常,用于处理各种常见的错误情况。以下是一些常见的异常类型:
ZeroDivisionError
:除数为零时引发。ValueError
:传入一个不适当的值(如范围外的值)给函数时引发。TypeError
:当操作或函数应用于不适当类型的对象时引发。NameError
:尝试访问一个未定义的变量时引发。IndexError
:尝试访问序列的索引超出其范围时引发。KeyError
:尝试访问字典中不存在的键时引发。FileNotFoundError
:尝试打开不存在的文件时引发(在Python 3.x中)。IOError
:输入输出错误(在Python 3.x中,IOError
已被OSError
取代,但IOError
仍然可用作OSError
的别名)。
3. 异常处理
基本的try...except
结构
try:
# 尝试执行的代码块
result = 10 / 0
except ZeroDivisionError:
# 处理ZeroDivisionError异常的代码块
print("除数不能为0")
捕获多个异常
try:
# 尝试执行的代码块
pass
except (ZeroDivisionError, ValueError) as e:
# 处理ZeroDivisionError或ValueError异常的代码块
print(f"捕获到异常:{e}")
使用else
和finally
else
块:如果没有异常发生,则执行else
块中的代码。finally
块:无论是否发生异常,finally
块中的代码都会被执行。通常用于资源清理,如关闭文件或释放锁。
try:
# 尝试执行的代码块
pass
except ZeroDivisionError:
# 处理异常的代码块
print("除数不能为0")
else:
# 没有异常时执行的代码块
print("一切正常")
finally:
# 无论是否发生异常都会执行的代码块
print("执行清理工作")
4. 自定义异常
Python允许通过继承内置的Exception
类来创建自定义异常。
class MyCustomError(Exception):
def __init__(self, message="这是一个自定义异常"):
self.message = message
super().__init__(self.message)
try:
raise MyCustomError("出错了!")
except MyCustomError as e:
print(e)
总结
异常处理是Python编程中不可或缺的一部分,它使程序更加健壮和易于维护。通过合理地使用try...except
语句块,以及自定义异常,可以有效地控制程序在遇到错误时的行为,从而提高用户体验和程序的稳定性。