【发布时间】:2011-11-22 04:55:10
【问题描述】:
我想捕获一个异常,但前提是它来自下一级逻辑。
目的是处理由错误数量的参数调用函数引起的错误,而不掩盖函数实现产生的错误。
如何实现下面的wrong_arguments函数?
例子:
try:
return myfunc(*args)
except TypeError, error:
#possibly wrong number of arguments
#we know how to proceed if the error occurred when calling myfunc(),
#but we shouldn't interfere with errors in the implementation of myfunc
if wrong_arguments(error, myfunc):
return fixit()
else:
raise
附录:
有几种解决方案在简单的情况下工作得很好,但目前的答案都不能在装饰函数的实际情况下工作。
考虑以上myfunc 的可能值:
def decorator(func):
"The most trivial (and common) decorator"
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
def myfunc1(a, b, c='ok'):
return (a, b, c)
myfunc2 = decorator(myfunc1)
myfunc3 = decorator(myfunc2)
即使是保守的look-before-you-leap 方法(检查函数参数规范)在这里也失败了,因为大多数装饰器的argspec 都是*args, **kwargs,而不管装饰的函数是什么。异常检查似乎也不可靠,因为myfunc.__name__ 将只是大多数装饰器的“包装器”,无论核心函数的名称如何。
如果函数可能有或可能没有装饰器,有什么好的解决方案吗?
【问题讨论】:
-
答案:不要这样做。为什么要处理具有错误参数数量的函数的情况?我认为以不同的方式解决您的潜在问题会带来更好的解决方案。
-
通过 C API 调用 python 函数时,如果能够捕获错误的参数错误,那就太好了。也就是说,当调用 pValue = PyObject_CallObject(pFunc, pArgs);有没有办法检测从 C++ 传递的参数与 Python 函数所期望的参数之间何时不匹配?现在,它只是立即返回,没有提示出了什么问题。
-
@user2787699:这是一个问题,不是评论。
标签: python exception try-catch decorator