本文目录导读:

在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异常捕获的常见用法和最佳实践,根据你的具体需求选择合适的方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播