2013-06-10 4 views
0

Предположим, что хорошо структурированное приложение OOP Python, где каждый вызов метода завернут в блок try. Теперь предположим, что я отлаживаю это приложение, и я хочу, чтобы на самом деле были исключены исключения! Было бы неуместно заменять каждую строку if True: и прокомментировать """ порты except:, просто для отладки. Есть ли способ рассказать интерпретатору Python, что исключения, заданные определенной частью кода, должны остановить выполнение программы и распечатать информацию об исключении в stdout?Не перехватывайте исключения, даже изнутри блока try

Python 2.7.3 или 3.2.3 на Kubuntu Linux.

+0

Похоже на банку червей для меня. Предположим, что в этом методе используется некоторая встроенная функция, например 'len', и эта встроенная функция использует исключения во время обычной работы. (Например, 'len (x)' может выполнять итерацию с увеличением значений i до тех пор, пока 'x [i]' не вызовет 'IndexError', а затем вернет i.) Тогда ваша гипотетическая« зона отсутствия »скажет вам, что« len » сломанный, когда это действительно не так. – Kevin

+0

@Kevin. Или, что еще более конкретно, в случае итерации '__next__' вызывает' StopIteration', который неявно поймается зацикливающей конструкцией, поэтому он знает, чтобы перестать вызывать '__next__'! – mgilson

+0

@ Kevin, mgilson: Я имею в виду, что код будет вести себя так же, как если бы он не был завернут в блок try. – dotancohen

ответ

2

«Пусть хорошо структурированное приложение ООП Python, где каждый вызов метода обернут в блоке try ... »

Это не кажется мне хорошо структурированным. Одним из основных принципов обработки исключений является ТОЛЬКО ОБРАБОТКА ОБОРУДОВАНИЯ, КОТОРЫЕ ВЫ ЗНАЕТЕ, КАК СДЕЛАТЬ. Это является движущим принципом общего «не использовать голые за исключением» заявление, что вы увидите:

try: 
    do_something() 
except: #BAD BAD BAD 
    react_to_exception() 

«Брошенный определенной частью коды» ... Как конкретный раздел кода является мы говорим? Если это один блок, вы всегда можете повторно рейзить:

try: 
    do_something() 
except ValueError as e: 
    raise e 
+0

Спасибо. 'raise e' на самом деле выдает исключение из среды, как мне нужно, но не показывает мне, в какой строке кода произошло исключение, только строка кода, в которой найден оператор' raise'. Как я могу найти, какая линия является преступником? Благодаря! – dotancohen

+2

@dotancohen Почему вы ловите исключение, с которым вы вообще не знаете, как бороться? Вся ваша проблема возникает из-за того, что вы преждевременно ловите исключения! Просто удалите все 'try ... except' и поймайте только те исключения, которые вы знаете 1. где они происходят, и 2. как их обрабатывать. – kqr

+0

Я согласен с тобой на 100%. Благодарю. – dotancohen

1

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

import traceback 

try: 
    func() 
except Exception,e: 
    print traceback.format_exc() 

Или используйте отладчик - PDB

+0

'sys.excepthook = my_excepthook': также настраивается пользовательский excepthook. Я использую это для отображения окна отчета об ошибке в моей программе. –

+0

да .. это тоже можно сделать. – rajpy

+0

'sys.excepthook' вызван только для неперехваченных исключений. По данным ОП, все исключения пойманы. – chepner

2

Этот звук как работа для отладчика. Я знаком с отладчиком только для PyCharm, с помощью которого вы можете установить контрольную точку исключения для любого исключения.

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