I would like to set "errored" to False if the exception is a Timeout error. I'm a little confused how try except flows work in python here (and surprisingly couldn't find any doc clarifying this - if anyone has one regarding how the blocks are executed please feel free to link), like if multiple exception blocks are true, do they all execute? Or just the first one? I assume the below doesn't work because we don't have access to 'r'
try:
r = request(
method="POST",
...
)
r.raise_for_status()
resp = r.json()
errored = False
except Exception as e:
resp = _parse_json(e)
errored = True
if r.Timeout:
errored = False
And the below is the effect I want, just not sure if it works as intended with the try/except flow
try:
r = request(
...
)
r.raise_for_status()
resp = r.json()
errored = False
except Exception as e:
resp = _parse_json(e)
errored = True
except r.Timeout:
errored = False
This is my first time handling/making post requests so please bear with me!
CodePudding user response:
From what I've researched, in python the flow falls on the first except that matches the exception. In this case, place the timeout exception first.
import socket
import logging
errored = False
hostname = '10.255.255.1'
port = 443
socket.setdefaulttimeout(0.1)
try:
sock = socket.create_connection((hostname, port))
except ZeroDivisionError:
print('must not enter here')
except socket.timeout as err:
print('timeout')
errored = False
except Exception as ex:
print('base exception')
errored = True
except:
print('unknown exception')
errored = True
else:
print('success')
finally:
print('This is always executed')
This code example makes a request that will timeout, will always fall into
except socket.timeout as err:
and then in finally. you can change the order of except to test.
here a link about trycatch.
Hope this helps