学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


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 异常处理原则

  1. 具体异常优先
def exception_handling_order():
    try:
        # 可能产生异常的代码
        pass
    except ValueError:
        # 处理特定异常
        pass
    except Exception:
        # 处理一般异常
        pass
  1. 只捕获预期异常
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  # 可选:重新抛出异常