Мне всегда было интересно, кто берет на себя управление программой после исключения.Я искал четкого ответа, но не нашел никакого.У меня описаны следующие функции, каждая из которых выполняет вызов API, который включает в себя сетевой запрос, поэтому мне нужно обрабатывать любые возможные ошибки с помощью блока try / исключением и, возможно, еще (ответы JSON также должны быть проанализированы / декодированы):
# This function runs first, if this fails, none of the other functions will run. Should return a JSON.
def get_summary():
pass
# Gets executed after get_summary. Should return a string.
def get_block_hash():
pass
# Gets executed after get_block_hash. Should return a JSON.
def get_block():
pass
# Gets executed after get_block. Should return a JSON.
def get_raw_transaction():
pass
Я хочу реализовать в каждой функции своего рода функцию повтора, поэтому, если она завершится неудачно из-за ошибки тайм-аута, ошибки соединения, ошибки декодирования JSON и т. Д., Она будет повторяться без ущерба для потока программы.:
def get_summary():
try:
response = request.get(API_URL_SUMMARY)
except requests.exceptions.RequestException as error:
logging.warning("...")
#
else:
# Once response has been received, JSON should be
# decoded here wrapped in a try/catch/else
# or outside of this block?
return response.text
def get_block_hash():
try:
response = request.get(API_URL + "...")
except requests.exceptions.RequestException as error:
logging.warning("...")
#
else:
return response.text
def get_block():
try:
response = request.get(API_URL + "...")
except requests.exceptions.RequestException as error:
logging.warning("...")
#
else:
#
#
#
return response.text
def get_raw_transaction():
try:
response = request.get(API_URL + "...")
except requests.exceptions.RequestException as error:
logging.warning("...")
#
else:
#
#
#
return response.text
if __name__ == "__main__":
# summary = get_summary()
# block_hash = get_block_hash()
# block = get_block()
# raw_transaction = get_raw_transaction()
# ...
Я хочу сохранить чистый код на самой внешней его части (блок после if __name__ == "__main__":
), я имею в виду, я не хочу заполнять его полными перепутанных блоков try / catch,ведение журнала и т. д.
Я пытался вызвать саму функцию, когда исключение вызвало какую-либо из этих функций, но затем я прочитал об ограничении стека и подумал, что это плохая идея, должен быть лучший способ справиться с этим.
request
повторяет попытку самостоятельно N раз, когда я вызываю метод get, где N - константа в исходном коде,равно 100. Но когда число повторных попыток достигнет 0, будет выдано сообщение об ошибке, которое мне нужно перехватить.
Где мне декодировать ответ JSON?Внутри каждой функции и обернуты другим блоком try / catch / else?или в основном блоке?Как я могу восстановиться после исключения и продолжать примерять функцию, в которой оно вышло из строя?
Любой совет будет благодарен.