2014-12-08 2 views
0

Я ищу лучший способ, как написать функцию переноса в python (2.6). Эта функция принимает команду (вызов функции) в качестве параметра и завершает сценарий, когда этот вызов не прошел хорошо (возвращаемое значение ошибки). Основная проблема, которую я вижу, заключается в том, что, когда происходит вложенный вызов, который не выполняется, wrap также должен обнаружить это событие и завершить сценарий. НапримерЛучший способ моделирования «wrap» в python

def foo1(x): 
    y = foo2(x) 
    return y 

def foo2(y): 
    y = 2**y 
    return y 

then I use wrap like this: 

wrap(foo1(2)) 

Пожалуйста, обратите внимание этот пример крайне упрощена.

Дело в том, что оболочка должна обнаруживать, что ошибка возникает даже в foo2.

Благодарим за любые ответы.

+0

Не можете ли вы просто использовать 'try ... except', чтобы уловить ошибки в' wrap' функции? – thefourtheye

+0

Вопрос не для меня понятен. Исключения будут распространяться, и вы можете поймать их на любом уровне. – bosnjak

+0

Я думаю, что мне придется использовать try, но я могу захотеть обернуть исполняемое приложение (как подпроцесс). Попробуй сам справиться с этой ошибкой? –

ответ

0

Если вы не начнете копаться с байт-кодом Python, нет четкого способа делать то, что вы просите. И даже тогда, не ясно, как то, что делает обнаружение ошибок в виду, потому что вы можете вызывать другие функции из кода, как и для расчета sqrt ряда:

>>> def foo3(y): 
... y = sqrt(5) 
... return y 
... 

Что делает ошибку на sqrt среднем ?

Два наиболее распространенных способов проверки кода являются:

(1) Только забочусь об одном одно значение. Если вы хотите протестировать более одной функции, проверьте каждый из них по отдельности:

wrap(foo1(2)) 
wrap(foo2(2)) 
wrap(foo3(2)) 

(2) Используйте исключения. Каждая функция отвечает за сигнализацию об ошибке, и из обертывания вы обнаруживаете эту ошибку:

def wrap(f, args, kwargs={}): 
    try: 
    f(*args, **kwargs) 
    except: 
    print("Error on f") 

def main(): 
    wrap(foo1, (2,)) 
    wrap(foo2, (2,)) 
    wrap(foo3, (2,)) 
Смежные вопросы