2013-06-07 2 views
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) 

Я хочу передать, какой метод был проблемой, так что я могу дать пользователю возможность повторить попытку, например, с подсказкой или чем-то еще после того, где будет напечатан (e). Есть идеи?

Edit:

В основном я хотел бы мой, кроме кода выглядеть как этого

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 

ответ

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) 
+0

Спасибо! Я на самом деле заработал это время между этим ответом и последним, хотя на самом деле это довольно близко. – Funkyguy

+1

Неохотно upvoting. Это красота Python, но вы действительно не должны использовать это в подходе в любом серьезном проекте. – Krumelur

3

Вы можете использовать модуль обратного прослеживания для обеспечения трассировки стеки информации об исключениях.

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

А я получил его, на самом деле traceback.print_exc(), как выясняется. Итак, это позволит мне получить переменную, которую я могу использовать для «вызова» метода? – Funkyguy

+0

Я не уверен, что это то, что задают. Это будет полезно при отладке ошибки, но это не поможет пользователю восстановить ее. – Krumelur

+0

Хммм, ладно. Хотя я поставил вопрос довольно ясно. Я просто ищу способ получить метод, в котором было сделано исключение для повышения. Таким образом, я могу просто походить: «введите новое значение», а затем пользователь будет вводить другое значение, а затем он будет повторять попытку метод снова – Funkyguy

0

Вы хотите, чтобы Python вызывал traceback. Эта стандартная функция позволяет получателю исключения видеть стек вызовов, откуда он был брошен.

1

Все это очень сильно зависит от того, как выглядит остальная часть вашего кода. Нет простого решения того, чего вы хотите достичь. Для этого вам необходимо сохранить не только ссылку на функцию, но и текущее состояние вашего приложения. Если программа обрабатывает информацию в цикле, вы можете быть в состоянии использовать что-то вроде:

while XXX: 
    try: 
     o1, o2 = get_user_input_somehow(...) 
     foo(o1, o2) 
    except ValueError as e: 
     print "Error:",e 
     print "Please try again" 
Смежные вопросы