我有各种错误检查方法,它们主要只是值或类型检查,我想让用户有机会修复它,这样他们就不会丢失一堆关于程序正在做什么的信息。
此时,我就是这样:
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
答案 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的东西。此标准功能允许异常的接收者看到它被抛出的调用堆栈。