Mam wiele wierszy z rzędu, które mogą rzucić wyjątek, ale bez względu na to, powinien nadal kontynuować następny wiersz. Jak to zrobić, jeśli pojedynczo nie próbujesz przechwycić każdej instrukcji, która może rzucić wyjątek?Jak zapobiec próbom złapania każdej możliwej linii w python?
try:
this_may_cause_an_exception()
but_I_still_wanna_run_this()
and_this()
and_also_this()
except Exception, e:
logging.exception('An error maybe occured in one of first occuring functions causing the others not to be executed. Locals: {locals}'.format(locals=locals()))
Zobaczmy nad kodem, wszystkie funkcje mogą rzucać wyjątki, ale w dalszym ciągu powinno wykonać następnego FUNKCJE bez względu na to zwrócił wyjątek czy nie. Czy jest to dobry sposób na zrobienie tego?
ja nie chcę to zrobić:
try:
this_may_cause_an_exception()
except:
pass
try:
but_I_still_wanna_run_this()
except:
pass
try:
and_this()
except:
pass
try:
and_also_this()
except:
pass
myślę kod powinien nadal kontynuować jazdę po drodze wyjątku tylko wtedy, gdy wyjątek jest krytyczna (Komputer będzie spalić lub cały system dostanie pomieszane, powinno zatrzymaj cały program, ale dla wielu małych rzeczy są również zgłaszane wyjątki, takie jak połączenie nie powiodło się itd.). Zwykle nie mam żadnych problemów z obsługą wyjątków, ale w tym przypadku używam biblioteki innej firmy, która łatwo zgłasza wyjątki dla małych rzeczy.
Po przeanalizowaniu odpowiedzi m4spy pomyślałem, że nie byłoby możliwe posiadanie dekoratora, który pozwoli na uruchomienie każdej linii w funkcji, nawet jeśli jeden z nich zgłasza wyjątek.
Coś takiego byłoby cool:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception:
logging.exception('...')
some_special_python_keyword # which causes it to continue executing the next line
return _wrapper
Albo coś takiego:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
for line in func(*args, **kwargs):
try:
exec line
except Exception:
logging.exception('...')
return _wrapper
@silent_log_exceptions
def save_tweets():
a = requests.get('http://twitter.com)
x = parse(a)
bla = x * x
Żadna z tych stylów kodowania czuć strasznie pythonic ... Nie jestem pewien, co się sugerować, ale ja czekam na odpowiedź. – Crisfole