簡體   English   中英

如何獲得引發異常的方法?

[英]How do I get the method that my exception was raised in?

我有各種錯誤檢查方法,它們主要是值或類型檢查,我想給用戶一個機會來修復它,這樣他們就不會丟失一堆關於程序正在做什么的信息。

在這一點上,我只有這個:

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

您可以使用traceback模塊提供有關異常的堆棧跟蹤信息。

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

可以通過一些內省做到這一點,但你不應該這樣做

下面的代碼將允許您調用引發異常的函數,但幾乎可以肯定有更好的方法來執行您正在嘗試實現的任何內容...

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)

這一切都在很大程度上取決於代碼的其余部分。 對於您想要實現的目標,沒有簡單的解決方案。 為此,您不僅要存儲函數引用,還要存儲應用程序的當前狀態。 如果您的程序循環處理信息,您可以使用以下內容:

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

你想要Python稱之為追溯的東西 此標准功能允許異常的接收者看到它被拋出的調用堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM