3

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

在这一点上,我只有这个:

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

4 回答 4

3

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

import traceback
...
try:
  pass
except ValueError as e:
  print("Error {0}".format(e))
  traceback.print_exc()
于 2013-06-07T13:58:38.013 回答
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)
于 2013-06-07T17:25:36.300 回答
1

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

while XXX:
    try:
        o1, o2 = get_user_input_somehow(...)
        foo(o1, o2)
    except ValueError as e:
        print "Error:",e
        print "Please try again"
于 2013-06-07T14:04:44.493 回答
0

你想要 Python 所说的traceback。这个标准功能让异常的接收者可以看到抛出异常的调用堆栈。

于 2013-06-07T13:58:54.263 回答