2015-11-29 4 views
2

EDIT: после прочтения комментариев и ответов я понимаю, что то, что я хочу сделать, не имеет большого смысла. Я имел в виду, что у меня есть некоторые места в моем коде, которые могут потерпеть неудачу (обычно некоторые requests звонки, которые могут не пойти), и я хотел их поймать вместо , помещая try: всюду. Моя конкретная проблема была такой, что я бы не беспокоился, если они потерпят неудачу и не повлияет на остальную часть кода (скажем, вызов сторожевого таймера).как поймать все неперехваченные исключения и продолжить?

Я оставлю этот вопрос для будущих поколений, как ода «думать о реальной проблемы, а затем спросить:»

Я пытаюсь обрабатывать все пойманные (в противном случае необработанные) исключения:

import traceback 
import sys 

def handle_exception(*exc_info): 
    print("--------------") 
    print(traceback.format_exception(*exc_info)) 
    print("--------------") 

sys.excepthook = handle_exception 
raise ValueError("something bad happened, but we got that covered") 
print("still there") 

Это выводит

-------------- 
['Traceback (most recent call last):\n', ' File "C:/Users/yop/.PyCharm50/config/scratches/scratch_40", line 10, in <module>\n raise ValueError("something bad happened, but we got that covered")\n', 'ValueError: something bad happened, but we got that covered\n'] 
-------------- 

Таким образом, в то время как повышение действительно поймали, он не сделал работайте так, как я думал: звонок в handle_exception, затем возобновите работу с print("still there").

Как это сделать?

+2

Вы не можете, и это не разумно, что нужно сделать - что, если плохо означает, что переменная не установлена?Если вы запустите следующую строку, которая теперь называется 'NameError'? – Eric

+0

Вы пытаетесь сделать что-то вроде https://github.com/ajalt/fuckitpy – jonrsharpe

+0

@jonrsharpe: после некоторого фактического мышления - да, я так думаю. Я обновляю свой вопрос с этим мышлением. – WoJ

ответ

3

Вы не можете сделать это, потому что Python называет sys.excepthookfor uncaught exceptions.

В интерактивном сеансе это происходит непосредственно перед возвратом элемента управления в приглашение; в программе Python это происходит непосредственно перед выходом программы.

Невозможно возобновить выполнение программы или «подавить» исключение в sys.excepthook.

Ближайший я могу думать о

try: 
    raise ValueError("something bad happened, but we got that covered") 
finally: 
    print("still there") 

Там нет except пункт, поэтому ValueError не будет пойман, но finally блок гарантированно будет выполнен. Таким образом, крючок исключения еще будет называться и 'still there' будет напечатан, но пункт finally будет выполняться до тогоsys.excepthook:

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

(от here)

+0

* Невозможно возобновить выполнение программы или «подавить» исключение в 'sys.excepthook'. * Это. – WoJ

0

Ты после:

import traceback 
import sys 

try: 
    raise ValueError("something bad happened, but we got that covered") 
except Exception: 
    print("--------------") 
    print(traceback.format_exception(sys.exc_info())) 
    print("--------------") 
print("still there")