2016-11-06 4 views
0

С кодом блока:Python функция триггера поднять исключение, не изменяя его

1 import re 
2 import sys 
3 import traceback 
4 
5 def foo(arg): 
6  if isinstance(arg, dict): 
7   return arg.get('key', 0) 
8  return 0 
9 
10 arg = {} 
11 
12 
13 
14 try: 
15  foo(arg) 
16 except Exception: 
17  lines = traceback.format_exception(*sys.exc_info()) 
18  for line in lines: 
19   m = re.match(r' File .*, line (\d+), in foo\n.*\n', line) 
20   if m and int(m.group(1)) < 5: 
21    print("Foo threw!") 
22    sys.exit() 
23  raise 
24 else: 
25  sys.stderr.write("foo did not throw!") 

Возникает вопрос: могу ли я добавить код логики между линией 10-14, таким образом, сделать окончательный поток управления код может достигать в строка , где Foo threw! распечатано? Внимание, что коды между строками 1-10 и после строки 14 НЕ МОЖЕТ быть изменен.

Я пытался написать еще одну функцию, чтобы вызвать исключение, заменить foo() с ним, он не работает, так как if в строке 20, тест против < 5, «защитить» произошло исключение перед строкой 5.

+0

В чем ваш вопрос? Вы просите нас написать код для размещения между строками 10 и 14? Если да, то что вы пробовали, и где именно ваши трудности? –

ответ

0

нет, потому что эти строки:

m = re.match(r' File .*, line (\d+), in foo\n.*\n', line) 
if m and int(m.group(1)) < 5 

означает, что ошибка должна произойти в строках 1-4, которые приходят, прежде чем foo, так что это даже не представляется возможным, если добавить ошибку в первой строке foo.

+0

спасибо, как насчет переезда 'def foo (arg):' to line 4? – Bin

+0

Я так не думаю, я не думаю, что ошибка может быть выбрана в строке 'def'. –

Смежные вопросы