2012-01-18 4 views
8

Прежде всего - у меня нет проблем с кодом с четным выражением, и у меня есть идея, как это исключение работает.Как уловить IndentationError

Прошу, если есть какой-либо способ поймать IndentationError в коде с помощью блока try/except? Например, допустим, я пишу тест для функции, написанной кем-то другим. Я хочу запустить его в try/except block и обработать все предупреждения, которые он может сделать. Я знаю, что это не лучший пример, но первый приходит мне на ум. Пожалуйста, не сосредотачивайтесь на примере, а скорее на проблеме.

Давайте посмотрим на код:

try: 
    f() 
except IndentationError: 
    print "Error" 

print "Finished" 

Функция:

def f(): 
    print "External function" 

И результат:

External function 
Finished 

И это то, что я готов понять, поскольку отступ во внешней функции был постоянным.

Но когда функция выглядеть так:

def f(): 
    print "External function" 
    print "with bad indentation" 

Исключение составляет необработанное:

print "with bad indentation" 
    ^
IndentationError: unexpected indent 

Есть ли способ, чтобы достичь этого? Наверное, это вопрос компиляции, и до сих пор я не вижу никакой возможности поймать. Имеет ли смысл except IndentationError?

+0

Обратите внимание, что 'IndentationError' является подклассом' SyntaxError'. –

ответ

11

Да, это можно сделать. Тем не менее, тестируемая функция должна была бы находиться в другом модуле:

# test1.py 
try: 
    import test2 
except IndentationError as ex: 
    print ex 

# test2.py 
def f(): 
    pass 
     pass # error 

При запуске это правильно устраняет исключение. Не стоит ничего проверять на всем модуле сразу; Я не уверен, есть ли способ сделать его более мелким.

5

Вы можете использовать такой инструмент, как pylint, который проанализирует ваш модуль и сообщит о плохом отступе, а также о многих других ошибках.

6

IndentationError поднят, когда модуль скомпилирован. You может уловить его при импорте модуля, так как модуль будет скомпилирован при первом импорте. Вы не можете поймать его в том же модуле, который содержит try/except, потому что с IndentationError Python не сможет завершить компиляцию модуля, и никакой код в модуле не будет запущен.

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