Python 的 try-except
块的用法详解
1. 抛出异常(raise)
在 except
块中,你可以:
- 重新抛出当前异常(继续向上层传递)
- 抛出新的异常(自定义错误信息或类型)
(1) 重新抛出当前异常(不加修改)
try:
result = 10 / 0
except ZeroDivisionError:
print("捕获到除以零错误,但继续抛出")
raise # 重新抛出相同的异常
效果:
- 程序会打印消息,但仍然会因
ZeroDivisionError
终止。
(2) 抛出新的异常(自定义错误)
try:
age = int(input("请输入年龄: "))
if age < 0:
raise ValueError("年龄不能为负数") # 主动抛出异常
except ValueError as e:
print(f"输入错误: {e}")
raise # 可以选择继续抛出,或者用 raise ValueError("新的错误信息") 自定义
效果:
- 如果输入负数,会抛出
ValueError
并打印错误信息。
2. 跳过异常(继续执行)
如果不想让异常终止程序,可以在 except
块中处理错误后继续执行。
(1) 静默跳过(不显示错误)
try:
result = 10 / 0
except ZeroDivisionError:
pass # 直接跳过,不做任何处理
效果:
- 程序不会崩溃,但也不会提示错误(可能隐藏潜在问题,慎用!)。
(2) 记录错误后继续
try:
file = open("data.txt", "r")
except FileNotFoundError:
print("文件不存在,但程序继续运行") # 记录错误,但不终止
# 可以设置默认值
content = "默认内容"
else:
content = file.read()
file.close()
print(content) # 无论是否出错,都会执行
效果:
- 即使文件不存在,程序也不会崩溃,而是使用默认值继续运行。
3. 结合 else
和 finally
else
:仅当try
块无异常时执行finally
:无论是否异常都会执行(适合资源清理)
try:
data = {"key": "value"}
print(data["nonexistent_key"]) # KeyError
except KeyError:
print("键不存在,跳过错误")
else:
print("这行只会在无异常时执行")
finally:
print("这行无论如何都会执行")
输出:
键不存在,跳过错误
这行无论如何都会执行
总结
操作 | 代码示例 | 用途 |
---|---|---|
抛出异常 | raise 或 raise ValueError("msg") | 终止当前流程,向上层传递错误 |
跳过异常 | except: pass | 忽略错误,继续执行(慎用!) |
记录后继续 | except: print(...) | 提示错误但程序不终止 |
else | else: ... | 仅当无异常时执行 |
finally | finally: ... | 无论是否异常都执行(如关闭文件) |
最佳实践
✅ 推荐:
- 在
except
中明确处理错误(如提供默认值或记录日志)。 - 使用
finally
确保资源释放(如关闭文件、数据库连接)。
❌ 不推荐:
- 使用
except: pass
完全忽略错误(可能隐藏严重问题)。 - 过度捕获异常(应只捕获你能处理的错误)。