Python 错误处理基础
在编写Python程序时,错误是不可避免的。文件可能不存在,用户输入可能无效,或者网络连接可能中断。错误处理机制可以帮助程序在遇到异常情况时优雅地应对,而不是直接崩溃。错误处理的核心目标是:捕获并处理运行时错误,提供清晰的错误信息 确保程序的健壮性和稳定性
try-except 基本语法
Python内置了多种异常类型,用于表示不同类型的错误。以下是一些常见的异常:
ZeroDivisionError
:除以零时触发FileNotFoundError
:尝试访问不存在的文件TypeError
:操作或函数应用于不适当的类型ValueError
:函数接收到正确类型但值不合适的参数IndexError
:序列索引超出范围
了解这些异常类型有助于针对性地处理错误。以下是一个展示多种异常的示例:
def process_data(data, index):
try:
result = 10 / data
lst = [1, 2, 3]
value = lst[index]
return value
except Exception as e:
print(f"An error occurred: {e}")
# 触发 ZeroDivisionError
process_data(0, 1)
# 触发 IndexError
process_data(5, 10)
输出:
An error occurred: division by zero
An error occurred: list index out of range
Python使用try-except
结构来捕获和处理异常。基本语法如下:
try
块包含可能引发异常的代码except
块定义如何处理特定异常
以下是一个简单的示例,处理除以零的错误:
def divide_numbers(a, b):
try:
result = a / b
print(f"Result: {result}")
except ZeroDivisionError:
print("Error: Cannot divide by zero!")
# 测试代码
divide_numbers(10, 2) # 正常情况
divide_numbers(10, 0) # 触发异常
输出:
Result: 5.0
Error: Cannot divide by zero!
在这个例子中,try
块尝试执行除法运算。如果b
为0,ZeroDivisionError
会被捕获,程序会执行except
块中的代码,而不会崩溃。
捕获特定异常
捕获所有异常(使用except Exception
)可能掩盖未预期的错误,因此最好只捕获特定的异常类型。可以通过列出多个except
块来处理不同类型的异常。
以下是一个处理多种异常的示例:
def access_list_item(lst, index):
try:
value = lst[index]
print(f"Value at index {index}: {value}")
except IndexError:
print("Error: Index out of range!")
except TypeError:
print("Error: Invalid index type!")
# 测试代码
my_list = [1, 2, 3]
access_list_item(my_list, 1) # 正常情况
access_list_item(my_list, 5) # 触发 IndexError
access_list_item(my_list, "2") # 触发 TypeError
输出:
Value at index 1: 2
Error: Index out of range!
Error: Invalid index type!
在这个例子中,程序分别处理了IndexError
和TypeError
,并为每种异常提供了特定的错误消息。捕获特定异常可以让代码更清晰,也便于调试。
else和finally子句
除了try
和except
,Python还提供了else
和finally
子句,增强了错误处理的灵活性:
else
:在try
块没有引发异常时执行finally
:无论是否发生异常,都会执行(常用于清理资源)
以下是一个综合示例,展示else
和finally
的用法:
def read_file_content(filename):
try:
file = open(filename, 'r')
content = file.read()
except FileNotFoundError:
print(f"Error: File '{filename}' not found!")
else:
print("File read successfully!")
print(f"Content: {content}")
finally:
try:
file.close()
print("File closed.")
except NameError:
print("No file to close.")
# 测试代码
read_file_content("example.txt") # 文件不存在
read_file_content("sample.txt") # 假设 sample.txt 存在并包含 "Hello, World!"
输出(假设example.txt
不存在,sample.txt
存在):
Error: File 'example.txt' not found!
No file to close.
File read successfully!
Content: Hello, World!
File closed.
在这个例子中:
- 如果文件不存在,
except FileNotFoundError
会捕获错误 - 如果文件成功读取,
else
块会打印内容 finally
块确保文件被关闭(如果文件被打开),无论是否发生异常
总结
- 常见的异常类型及其触发场景
- 使用
try-except
捕获异常 - 针对特定异常进行处理
- 使用
else
和finally
增强错误处理逻辑