如何获得引发异常的方法?

时间:2013-06-07 13:56:09

标签: python python-2.7

我有各种错误检查方法,它们主要只是值或类型检查,我想让用户有机会修复它,这样他们就不会丢失一堆关于程序正在做什么的信息。

此时,我就是这样:

def foo(Option1, Option2): 
    if Option1 >= 0 and Option <= 100 :
        continue
    else:
        e = ('Hey this thing doesn\'t work')
        raise ValueError(e)

然后在调用它的程序中,我有

except ValueError as e:
    print(e)

我想传递问题的方法,以便我可以让用户有机会再次尝试,比如提示或者在print(e)语句所在的地方之后。有什么想法吗?

编辑:

基本上我希望我的除了代码看起来像这样

except ValueError as e:
    # print the error
    # get what method the error was raised in
    # method = the_method_from_above
    # prompt user for new value
    # send command to the method using the new value

4 个答案:

答案 0 :(得分:3)

您可以使用traceback模块提供有关异常的堆栈跟踪信息。

import traceback
...
try:
  pass
except ValueError as e:
  print("Error {0}".format(e))
  traceback.print_exc()

答案 1 :(得分:2)

可以通过一些内省来做到这一点,但你不应该

以下代码将允许您调用引发异常的函数,但几乎可以肯定有更好的方法来执行您想要实现的任何事情......

import sys

def foo(x):
    print('foo(%r)' % x)
    if not (0 <= x <= 100):
        raise ValueError

def main():
    try:
        foo(-1)
    except ValueError:
        tb = sys.exc_info()[2]
    while tb.tb_next is not None:
        tb = tb.tb_next
    funcname = tb.tb_frame.f_code.co_name
    func = globals()[funcname]
    func(50)

if __name__ == '__main__':
    main()

...打印出来......

foo(-1)
foo(50)

答案 2 :(得分:1)

这一切在很大程度上取决于代码的其余部分。对于您想要实现的目标,没有简单的解决方案。为此,您不仅要存储函数引用,还要存储应用程序的当前状态。如果您的程序在循环中处理信息,您可以使用以下内容:

while XXX:
    try:
        o1, o2 = get_user_input_somehow(...)
        foo(o1, o2)
    except ValueError as e:
        print "Error:",e
        print "Please try again"

答案 3 :(得分:0)

你想要Python称之为traceback的东西。此标准功能允许异常的接收者看到它被抛出的调用堆栈。