我有一个不可避免的情况是这样的(简化):

FUNCTION_TO_CALL = y # can be either y or z
def x(*args, **kargs):
  FUNCTION_TO_CALL(args, kargs)

def y(foo, bar=None):
  if foo == bar: # actually not this stupid
    raise TypeError()
  else:
    pass

def z(foo, bar, baz=None):
  pass

我知道,丑得可怕。:(
但是,无论如何,我需要能够区分在y中引发的类型错误,因为*args中没有任何内容或包含太多内容(因此没有足够的参数或太多)/badkwargs或是因为foo == bar
在实际设置中,可以调用的函数多于两个,并不是所有的函数都对它们开放代码。
非常感谢!

最佳答案

马特·比伦斯坦对基思·莫罗回答的评论是正确的做法。但是,如果出于某种奇怪的原因,您甚至不能这样做,您也可以查看inspect模块。

try: ugly()
except TypeError as e:
    stack = inspect.stack()
    [...look at the stack...]

Info about the inspect module.
要详细说明“包装”问题:假设您能够控制可分配给FUNCTION_TO_CALL的函数,请创建y_better
def y_better(foo, bar=None):
    try: y(foo, bar)
    except TypeError:
        if foo == bar: # detect foobar condition
            raise FoobarError()
        else:          # not foobar, so re-raise the exception
            raise

这意味着foo==bar将被测试两次,但是考虑到您的限制,我看不到更好的方法。

关于python - 通过调用的地方来区分相同的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4772233/

10-09 17:08