异常处理是编写健壮的Python程序的关键组成部分。它允许你优雅地处理程序执行过程中可能出现的错误,防止程序崩溃并为用户提供信息反馈。本教程深入探讨了Python异常处理的基本概念。
目录
1. try…except
try...except
块是异常处理的基础。可能引发异常的代码放在try
块中。如果发生异常,则执行相应的except
块。
try:
result = 10 / 0 # 这将引发ZeroDivisionError
except ZeroDivisionError:
print("错误:除以零!")
except TypeError:
print("错误:类型不匹配")
except Exception as e: # 捕获任何其他异常
print(f"发生意外错误:{e}")
else: # 可选的else块,如果没有发生异常则执行
print(f"结果:{result}")
finally: # 可选的finally块,总是执行
print("这段代码总是执行。")
此示例演示了如何处理ZeroDivisionError
。多个except
块可以处理不同的异常类型。可选的else
块仅在try
块中没有发生异常时才执行。可选的finally
块总是执行,非常适合用于清理任务,例如关闭文件。
2. raise Exception
raise
语句允许你显式地引发异常,从而发出错误或异常情况的信号。
def validate_age(age):
if age < 0:
raise ValueError("年龄不能为负数")
elif age > 120:
raise ValueError("年龄不现实地高")
return age
try:
age = validate_age(-5)
print(f"有效的年龄:{age}")
except ValueError as e:
print(f"错误:{e}")
在这里,如果年龄无效,validate_age
会引发ValueError
。你可以引发任何内置异常或创建自定义异常(继承自Exception
的类)。
3. try…finally
finally
块确保其中的代码始终执行,无论是否发生异常。这对于清理工作至关重要。
file = None
try:
file = open("my_file.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件未找到!")
finally:
if file:
file.close()
print("文件已关闭。")
这保证即使发生FileNotFoundError
,文件也会被关闭,从而防止资源泄漏。
4. 常见的内置异常
Python提供了许多内置异常:
ZeroDivisionError
:除以零。TypeError
:操作的类型不当。ValueError
:类型正确,但值不当。FileNotFoundError
:文件未找到。IndexError
:索引超出范围。KeyError
:字典中找不到键。ImportError
:导入失败。NameError
:名称未找到。
5. 创建自定义异常
为了更具体的错误处理,可以通过继承Exception
类来创建自定义异常:
class InvalidInputError(Exception):
pass
def process_data(data):
if not data:
raise InvalidInputError("数据不能为空")
# ...其余数据处理...
try:
process_data("")
except InvalidInputError as e:
print(f"自定义错误:{e}")
这允许更细粒度的错误处理和改进的代码可读性。
有效的异常处理对于编写健壮可靠的Python程序至关重要。通过预测和优雅地处理潜在的错误,你可以构建更强大和用户友好的应用程序。