Python异常处理机制详解
1. __name__变量使用说明
1.1 基本概念
__name__
是Python中的一个内置变量,用于标识当前模块的执行方式。
# example.py
def main():
print("执行主函数")
if __name__ == "__main__":
print("当前模块被直接运行")
main()
else:
print("当前模块被导入")
1.2 实际应用场景
# module.py
class Calculator:
@staticmethod
def add(a, b):
return a + b
# 模块测试代码
if __name__ == "__main__":
# 这些测试代码只在直接运行时执行
calc = Calculator()
print(calc.add(1, 2)) # 输出: 3
2. 异常处理
2.1 基本异常处理结构
2.1.1 简单异常捕获
def divide_numbers():
try:
x = int(input("请输入除数: "))
y = int(input("请输入被除数: "))
result = x / y
print(f"结果是: {result}")
except:
print("发生错误!")
2.1.2 捕获具体异常
def safe_division():
try:
x = int(input("请输入除数: "))
y = int(input("请输入被除数: "))
result = x / y
except ValueError:
print("请输入有效的数字!")
except ZeroDivisionError:
print("除数不能为零!")
except Exception as e:
print(f"发生未知错误: {e}")
2.2 高级异常处理
2.2.1 多异常处理
def file_operation():
try:
file = open("nonexistent.txt", "r")
content = file.read()
number = int(content)
except (FileNotFoundError, ValueError) as e:
print(f"处理多个异常: {e}")
except Exception as e:
print(f"捕获所有其他异常: {e}")
2.2.2 使用else和finally
def database_operation():
connection = None
try:
connection = create_database_connection()
data = connection.query("SELECT * FROM users")
except DatabaseError as e:
print(f"数据库错误: {e}")
else:
print("查询成功执行")
return data
finally:
if connection:
connection.close()
print("数据库连接已关闭")
2.3 异常的嵌套
def nested_exception_handling():
try:
try:
# 内部可能产生异常的代码
result = 1 / 0
except ZeroDivisionError:
print("内部异常:除以零")
raise # 重新抛出异常
except:
print("外部异常处理")
2.4 自定义异常
class CustomError(Exception):
"""自定义异常类"""
def __init__(self, message):
self.message = message
super().__init__(self.message)
def validate_age(age):
if age < 0:
raise CustomError("年龄不能为负数")
if age > 150:
raise CustomError("年龄超出正常范围")
return age
# 使用自定义异常
try:
age = validate_age(-5)
except CustomError as e:
print(f"验证失败: {e}")
3. 异常处理最佳实践
3.1 异常处理原则
- 具体异常优先
def exception_handling_order():
try:
# 可能产生异常的代码
pass
except ValueError:
# 处理特定异常
pass
except Exception:
# 处理一般异常
pass
- 只捕获预期异常
def focused_exception_handling():
try:
with open("config.txt") as f:
config = f.read()
except FileNotFoundError:
# 只处理文件不存在的情况
print("配置文件不存在,使用默认配置")
3.2 上下文管理
class ResourceManager:
def __enter__(self):
print("资源获取")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("资源释放")
if exc_type is not None:
print(f"处理异常: {exc_type}, {exc_val}")
return True # 抑制异常
# 使用上下文管理器
def use_resource():
with ResourceManager() as rm:
print("使用资源")
raise ValueError("测试异常")
3.3 异常链接
def process_data():
try:
# 尝试处理数据
raise ValueError("数据格式错误")
except ValueError as e:
# 抛出新异常,保留原始异常信息
raise RuntimeError("数据处理失败") from e
# 使用异常链接
try:
process_data()
except RuntimeError as e:
print(f"错误: {e}")
print(f"原始错误: {e.__cause__}")
3.4 日志记录异常
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def operation_with_logging():
try:
# 可能产生异常的操作
result = 1 / 0
except Exception as e:
logger.error("操作失败", exc_info=True)
raise # 可选:重新抛出异常