我有一个不可避免的情况是这样的(简化):
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/