1. 基础语法
借助 `try-except` 语句,程序可以捕获并处理异常。
python
try:
# 可能会引发异常的代码
result = 10 / 0 # 这行代码会引发 ZeroDivisionError
except ZeroDivisionError:
# 异常处理逻辑
print("错误:除数不能为零")
2. 捕获多种异常
你可以使用多个 `except` 子句来处理不同类型的异常。
python
try:
num = int("abc") # 会引发 ValueError
result = 10 / num # 若 num 为 0,会引发 ZeroDivisionError
except ValueError:
print("错误:无法将字符串转换为整数")
except ZeroDivisionError:
print("错误:除数不能为零")
3. 获取异常信息
通过 `as` 关键字,能够获取异常对象,进而获取更详细的错误信息。
python
try:
file = open("nonexistent.txt", "r")
except FileNotFoundError as e:
print(f"错误:文件不存在 - {e}")
4. 通用异常捕获
使用 `Exception` 可以捕获所有未被单独处理的异常,但通常建议将其放在最后,避免掩盖特定错误。
python
try:
# 可能会引发异常的代码
data = {"key": "value"}
print(data["nonexistent_key"]) # 会引发 KeyError
except KeyError as e:
print(f"错误:键不存在 - {e}")
except Exception as e:
print(f"发生未知错误:{e}")
5. `else` 子句
当 `try` 块中没有异常发生时,会执行 `else` 子句。
python
try:
result = 10 / 2 # 不会引发异常
except ZeroDivisionError:
print("错误:除数不能为零")
else:
print(f"计算结果:{result}") # 当没有异常时执行
6. `finally` 子句
无论是否有异常发生,`finally` 子句中的代码都会被执行,常用于资源清理工作。
python
try:
file = open("test.txt", "r")
content = file.read()
except FileNotFoundError:
print("错误:文件不存在")
finally:
if 'file' in locals():
file.close() # 确保文件被关闭
print("清理工作已完成")
7. 主动抛出异常
使用 `raise` 语句可以主动抛出异常。
python
def calculate_age(year):
current_year = 2025 # 假设当前年份是 2025
if year > current_year:
raise ValueError(f"出生年份 {year} 不能晚于当前年份")
return current_year - year
try:
age = calculate_age(2030)
except ValueError as e:
print(f"输入错误:{e}")
8. 自定义异常
你可以通过继承 `Exception` 类来创建自定义异常类。
python
class InvalidEmailError(Exception):
"""当电子邮件格式无效时抛出此异常"""
pass
def validate_email(email):
if "@" not in email:
raise InvalidEmailError(f"无效的电子邮件地址:{email}")
return True
try:
validate_email("example.com")
except InvalidEmailError as e:
print(f"验证失败:{e}")
9. 使用 `with` 语句
`with` 语句能够自动管理资源,避免手动进行资源关闭操作,例如文件操作。
python
try:
with open("test.txt", "r") as file:
content = file.read()
# 文件会在 with 块结束后自动关闭
except FileNotFoundError:
print("错误:文件不存在")
10. 最佳实践
- 避免捕获过于宽泛的异常,要精准处理特定类型的异常。
- 利用 `logging` 模块记录异常信息,而不是简单地打印错误。
- 自定义异常时,要提供清晰的错误信息。
- 使用 `with` 语句来管理资源,防止资源泄漏。
异常处理是编写可靠 Python 程序必不可少的部分。通过合理运用这些机制,能够有效提升程序的容错能力和用户体验。