Я пытаюсь собрать исключение в блоке except:
, но интерпретатор пытается быть полезным и печатает трассировки стека «силой». Можно ли это избежать?Python3: очистить цепочку исключений?
Немного справочной информации: Я играю с urwid, TUI library для python. Пользовательский интерфейс запускается по телефону urwid.MainLoop.run()
и заканчивается повышениемurwid.ExitMainLoop()
. Пока это отлично работает, но что происходит, когда возникает другое исключение? Например. когда я поймаю KeyboardInterrupt
(у Urwid MainLoop нет), я делаю некоторую очистку и хочу закончить пользовательский интерфейс - подняв соответствующее исключение. Но это приводит к экрану, полному следов стека.
Некоторые небольшие исследования показали, что python3 запоминает прикованные исключения, и можно явно вызвать исключение с «причиной»: raise B() from A()
. Я узнал несколько способов изменить или добавить данные относительно вышеперечисленных исключений, но не нашел способа отключить эту функцию. Я хотел бы избежать печати трассировки стека и строк, таких как The above exception was the direct cause of...
, и просто поднять исключение, связанное с интерфейсом, в блоке except:
, как если бы я был за пределами одного.
Возможно ли это, или я делаю что-то принципиально неправильно?
Edit: Вот пример, напоминающее мою текущую архитектуру, в результате чего в одной и той же проблемой:
#!/usr/bin/env python3
import time
class Exit_Main_Loop(Exception):
pass
# UI main loop
def main_loop():
try:
while True:
time.sleep(0.1)
except Exit_Main_Loop as e:
print('Exit_Main_Loop')
# do some UI-related clean up
# my main script
try:
main_loop()
except KeyboardInterrupt as e:
print('KeyboardInterrupt')
# do some clean up
raise Exit_Main_Loop() # signal the UI to terminate
К сожалению, я не могу изменить main_loop
к кроме KeyboardInterrupt
, а также. Есть ли образец для решения этой проблемы?
Вы вообще не хотите трассировки стека, или хотите только трассировку стека внешнего кода исключения или трассировку стека самого внутреннего исключения? – abarnert
Если вы не хотите трассировки стека _any_, просто оберните весь «основной» код в 'try:'/'except Exception as e:', а затем обработайте исключение, но вы хотите (например, 'print (repr (e)); sys.exit (1) '). – abarnert
Я бы хотел, чтобы ничего не указывало на возникновение исключения (для пользователя) - нет трассировки стека или другого вывода текста (за исключением того, что я печатаю самостоятельно, конечно). Я имею в виду, я выбрал исключение и сделал то, что должен был сделать - больше нет трассировки стека (я бы распечатал его сам, если бы захотел его прочитать). Точно так же urwid.MainLoop тоже выхватывает исключение Exit. Я не вижу причин, почему только потому, что есть два исключения в строке (оба зацепились должным образом), должен привести к результату, напоминающему исключение uncatched. – Julian