本文目录导读:

在Python中捕获程序异常主要使用try-except语句,以下是一些常见的异常捕获案例:
基础异常捕获
try:
# 可能出错的代码
num = int(input("请输入一个数字: "))
result = 10 / num
print(f"结果是: {result}")
except ZeroDivisionError:
print("错误:不能除以0!")
except ValueError:
print("错误:请输入有效的数字!")
except Exception as e:
print(f"其他错误: {e}")
捕获多个异常
try:
data = [1, 2, 3]
index = int(input("请输入索引: "))
print(data[index])
except (IndexError, ValueError) as e:
print(f"索引或输入错误: {e}")
使用else和finally
try:
file = open("test.txt", "r")
content = file.read()
except FileNotFoundError:
print("文件不存在")
else:
# 没有异常时执行
print("文件读取成功")
print(content)
finally:
# 无论是否有异常都执行
print("清理资源")
if 'file' in locals():
file.close()
自定义异常
class AgeError(Exception):
"""自定义年龄异常"""
def __init__(self, age, message="年龄必须大于0"):
self.age = age
self.message = message
super().__init__(self.message)
def check_age(age):
if age < 0:
raise AgeError(age)
elif age > 150:
raise AgeError(age, "年龄不能超过150岁")
return f"年龄: {age}"
try:
result = check_age(-5)
print(result)
except AgeError as e:
print(f"异常: {e.message}, 年龄: {e.age}")
实际应用案例 - 处理网络请求
import requests
from requests.exceptions import RequestException, Timeout
def fetch_data(url):
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # 检查HTTP状态码
return response.json()
except Timeout:
print("请求超时")
return None
except RequestException as e:
print(f"请求失败: {e}")
return None
except ValueError as e:
print(f"JSON解析失败: {e}")
return None
# 使用示例
try:
data = fetch_data("https://api.example.com/data")
if data:
print("数据获取成功")
except Exception as e:
print(f"未知错误: {e}")
断言异常处理
def divide(a, b):
assert b != 0, "除数不能为0"
return a / b
try:
result = divide(10, 0)
except AssertionError as e:
print(f"断言错误: {e}")
嵌套异常处理
try:
try:
num = int(input("请输入数字: "))
result = 100 / num
except ValueError:
print("输入不是有效数字")
raise # 重新抛出异常
except ZeroDivisionError:
print("不能除以0")
raise
except Exception as e:
print(f"外部捕获到异常: {e}")
最佳实践建议
- 尽量捕获具体异常,避免使用裸
except: - 不要忽略异常,至少记录日志
- 在合适的位置捕获,不要包装所有代码
- 使用finally清理资源,如关闭文件、数据库连接
# 推荐的做法
try:
with open("file.txt", "r") as f:
content = f.read()
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("没有读取权限")
finally:
# 使用with语句自动管理资源,不需要手动关闭
pass
掌握这些异常处理技巧,可以让你的Python程序更加健壮和可靠。