You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用装饰器为Python函数统一添加try/catch,避免重复编码

用Python装饰器统一添加try/catch异常处理

这问题太常见了,装饰器就是用来提取重复代码、给函数统一附加功能的绝佳方案,刚好能解决你不想写20遍try/catch的痛点。我给你从基础到进阶两种实现方式:

1. 基础通用版装饰器

这个版本适合所有函数需要统一捕获所有异常,并执行相同处理逻辑的场景(比如打印错误日志、返回默认值)。

先写装饰器的代码:

def handle_exceptions(func):
    def wrapper(*args, **kwargs):
        try:
            # 执行原函数逻辑
            return func(*args, **kwargs)
        except Exception as e:
            # 这里写你统一的异常处理逻辑,比如打日志、返回默认值
            print(f"函数 {func.__name__} 执行出错: {str(e)}")
            # 可以根据需求返回默认值,比如None或者特定提示
            return None
    return wrapper

然后怎么用?直接在你的函数上面加@handle_exceptions装饰器就行:

@handle_exceptions
def calculate_sum(a, b):
    return a + b

@handle_exceptions
def read_file(file_path):
    with open(file_path, 'r') as f:
        return f.read()

这样每个被装饰的函数都会自动带上try/catch逻辑,完全不用重复写了!

2. 进阶可定制版装饰器

如果不同函数需要捕获的异常类型不一样,或者错误处理逻辑有差异,咱们可以给装饰器加参数,让它更灵活:

def handle_specific_exceptions(exception_types=(Exception,), default_return=None, log_error=True):
    def decorator(func):
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except exception_types as e:
                if log_error:
                    print(f"函数 {func.__name__} 执行出错 [{type(e).__name__}]: {str(e)}")
                return default_return
        return wrapper
    return decorator

这个版本你可以自定义:

  • 要捕获的异常类型(比如FileNotFoundError、ValueError)
  • 出错时返回的默认值
  • 是否打印错误日志

举个使用例子:

# 只捕获ValueError,出错返回0
@handle_specific_exceptions(exception_types=ValueError, default_return=0)
def parse_number(s):
    return int(s)

# 捕获FileNotFoundError和PermissionError,出错返回空字符串
@handle_specific_exceptions(exception_types=(FileNotFoundError, PermissionError), default_return="")
def read_config(config_path):
    with open(config_path, 'r') as f:
        return f.read()

额外小贴士

  • 如果你的函数是类中的方法,这个装饰器同样适用,直接加在方法上面就行
  • 要是需要更复杂的错误处理(比如上报错误到监控系统),只需要修改装饰器里的except块逻辑就行,所有被装饰的函数都会自动生效
  • 可以用functools.wraps来保留原函数的元信息(比如函数名、文档字符串),调试的时候更方便,修改后的基础版如下:
import functools

def handle_exceptions(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"函数 {func.__name__} 执行出错: {str(e)}")
            return None
    return wrapper

加上@functools.wraps(func)后,calculate_sum.__name__还是calculate_sum,而不是wrapper,这对调试和文档生成很有用。

这样一来,你只需要写一次装饰器,然后给20个函数加上装饰器就行,完全不用重复写try/catch啦!

内容的提问来源于stack exchange,提问作者Calculus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:07:48