Catch the different exceptions with explicit clauses, and check the reason for the exception with URLError (thank you Régis B. and Daniel Andrzejewski)
from socket import timeout
from urllib.error import HTTPError, URLError
try:
response = urllib.request.urlopen(url, timeout=10).read().decode('utf-8')
except HTTPError as error:
logging.error('HTTP Error: Data of %s not retrieved because %s\nURL: %s', name, error, url)
except URLError as error:
if isinstance(error.reason, timeout):
logging.error('Timeout Error: Data of %s not retrieved because %s\nURL: %s', name, error, url)
else:
logging.error('URL Error: Data of %s not retrieved because %s\nURL: %s', name, error, url)
else:
logging.info('Access successful.')
NB For recent comments, the original post referenced python 3.2 where you needed to catch timeout errors explicitly with socket.timeout. For example
# Warning - python 3.2 code
from socket import timeout
try:
response = urllib.request.urlopen(url, timeout=10).read().decode('utf-8')
except timeout:
logging.error('socket timed out - URL %s', url)