Я искал другие сообщения, так как я чувствовал, что это довольно распространенная проблема, но все остальные вопросы об исключении Python, которые я нашел, не отражают мою проблему.
Я постараюсь быть таким же конкретным, как я могу, поэтому приведу прямой пример. И pleeeeease не публикует обходные пути для этой конкретной проблемы. Меня особо не интересует, как вы можете отправить электронное письмо гораздо лучше с помощью xyz. Я хочу знать, как вы, как правило, имеете дело с зависимыми заявлениями об ошибках.
Мой вопрос в том, как красиво обрабатывать исключения, которые зависят друг от друга, что означает: Только если первый шаг был успешным, попробуйте следующее и так далее. Еще один критерий: все исключения должны быть пойманы, этот код должен быть надежным.
Для вашего примера, пример:
try:
server = smtplib.SMTP(host) #can throw an exception
except smtplib.socket.gaierror:
#actually it can throw a lot more, this is just an example
pass
else: #only if no exception was thrown we may continue
try:
server.login(username, password)
except SMTPAuthenticationError:
pass # do some stuff here
finally:
#we can only run this when the first try...except was successful
#else this throws an exception itself!
server.quit()
else:
try:
# this is already the 3rd nested try...except
# for such a simple procedure! horrible
server.sendmail(addr, [to], msg.as_string())
return True
except Exception:
return False
finally:
server.quit()
return False
Для меня это выглядит крайне нерегулярно, а код обработки ошибок тройным реальным бизнес-кодом, но, с другой стороны, как я могу обрабатывать несколько операторов, которые зависят друг от друга, что означает, что выражение1 является обязательным условием для оператора2 и т.д.?
Я также заинтересован в правильной очистке ресурсов, даже Python может управлять этим для себя.
Спасибо, Том