本文目录导读:

在Python中,异常捕获使用 try-except 语句,以下是详细的案例说明:
基本语法结构
try:
# 可能引发异常的代码
result = 10 / 0
except:
# 异常处理代码
print("捕获到异常")
捕获特定异常类型
try:
num = int(input("请输入一个数字: "))
result = 10 / num
print(f"10/{num} = {result}")
except ValueError:
print("输入的不是有效数字")
except ZeroDivisionError:
print("除数不能为0")
except Exception as e:
print(f"其他异常: {e}")
完整的异常处理结构
try:
# 尝试执行的代码
file = open("example.txt", "r")
content = file.read()
num = int(content)
result = 100 / num
except FileNotFoundError:
print("文件不存在")
except ValueError:
print("文件内容不是有效数字")
except ZeroDivisionError:
print("文件中的数字不能为0")
except Exception as e:
print(f"未预料的异常: {e}")
else:
# 没有异常时执行
print(f"计算结果是: {result}")
finally:
# 无论是否异常都会执行
try:
file.close()
except:
pass
实际案例:用户输入验证
def safe_division():
"""
安全的除法运算,处理各种异常情况
"""
try:
num1 = float(input("请输入第一个数字: "))
num2 = float(input("请输入第二个数字: "))
result = num1 / num2
except ValueError:
print("❌ 输入无效,请输入数字")
return None
except ZeroDivisionError:
print("❌ 除数不能为0")
return None
except Exception as e:
print(f"❌ 发生未知错误: {e}")
return None
else:
print(f"✅ {num1} / {num2} = {result:.2f}")
return result
finally:
print("✓ 程序执行完毕")
# 测试
safe_division()
文件操作异常处理
def read_file_safe(filename):
"""
安全的文件读取函数
"""
try:
# 尝试打开文件
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
# 尝试处理文件内容
numbers = [int(x) for x in content.split()]
average = sum(numbers) / len(numbers)
return average
except FileNotFoundError:
print(f"文件 '{filename}' 不存在")
return None
except PermissionError:
print(f"没有权限读取文件 '{filename}'")
return None
except ValueError:
print("文件内容格式错误,需要数字")
return None
except ZeroDivisionError:
print("文件为空,无法计算平均值")
return None
except Exception as e:
print(f"读取文件时发生错误: {e}")
return None
# 使用示例
result = read_file_safe("data.txt")
if result is not None:
print(f"平均值是: {result}")
网络请求异常处理
import requests
def fetch_website(url):
"""
安全的网络请求函数
"""
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # 检查HTTP状态码
return response.text
except requests.exceptions.Timeout:
print("请求超时")
return None
except requests.exceptions.ConnectionError:
print("网络连接失败")
return None
except requests.exceptions.HTTPError as e:
print(f"HTTP错误: {e}")
return None
except Exception as e:
print(f"请求时发生错误: {e}")
return None
# 测试
content = fetch_website("https://example.com")
if content:
print("成功获取网站内容")
自定义异常
# 定义自定义异常
class AgeError(Exception):
"""年龄验证异常"""
def __init__(self, age, message="年龄无效"):
self.age = age
self.message = message
super().__init__(self.message)
class EmailError(Exception):
"""邮箱验证异常"""
pass
def validate_age(age):
"""验证年龄"""
if not isinstance(age, int):
raise TypeError("年龄必须是整数")
if age < 0:
raise AgeError(age, "年龄不能为负数")
if age > 150:
raise AgeError(age, "年龄超出合理范围")
return True
def validate_email(email):
"""验证邮箱"""
if "@" not in email:
raise EmailError("邮箱格式无效,缺少@符号")
if "." not in email:
raise EmailError("邮箱格式无效,缺少点号")
return True
# 使用自定义异常
def process_user_info():
try:
age = int(input("请输入年龄: "))
validate_age(age)
email = input("请输入邮箱: ")
validate_email(email)
print(f"用户信息验证成功! 年龄: {age}, 邮箱: {email}")
except AgeError as e:
print(f"年龄错误: {e}")
except EmailError as e:
print(f"邮箱错误: {e}")
except ValueError:
print("年龄必须是数字")
except Exception as e:
print(f"未知错误: {e}")
# 测试
# process_user_info()
最佳实践总结
# 1. 尽量不要捕获所有异常
# 不好
try:
# code
except:
pass
# 好
try:
# code
except SpecificError:
# 处理特定异常
# 2. 总是在finally中清理资源
file = None
try:
file = open("file.txt", "r")
# 处理文件
finally:
if file:
file.close()
# 3. 使用上下文管理器 (with语句) 自动处理
with open("file.txt", "r") as file:
content = file.read() # 自动关闭
# 4. 记录异常日志
import logging
logging.basicConfig(level=logging.ERROR)
try:
# code
except Exception as e:
logging.error(f"发生错误: {e}", exc_info=True)
# 或者
logging.exception("发生错误")
关键要点:
- 捕获特定异常:尽量捕获具体的异常类型
- 避免空except:除非有必要,不要使用
except:捕获所有异常 - 使用finally:确保资源被正确释放
- 记录日志:在生产环境中记录异常信息
- 异常链:使用
raise ... from ...保持异常链 - 自定义异常:为特定业务逻辑创建自定义异常
这些是Python异常捕获的常见用法和最佳实践,根据你的具体需求选择合适的方案。