[Python] Eccezione concatenata che causa l'uscita del programma

Piergiorgio Pancino piergiorgio.pancino a gmail.com
Lun 29 Ott 2018 10:48:19 CET


Ciao a tutti,
vi chiedo un aiuto perché non riesco a capire che cosa mi sfugge...
In sostanza ho una classe che deriva da logging.handler.BufferingHandler
modificata da me in modo da inviare delle mail al raggiungimento di alcune
condizioni. In condizioni normali la classe funziona.
Prima di andare in "produzione" chiaramente sto testando lo script in
condizioni particolari, nella fattispecie si può verificare una mancanza di
connessione che va gestita: proprio in questa condizione ho una
concatenazione di eccezioni che mi forzano l'uscita del programma (cosa che
non è voluta) nonostante io abbia una clausura except che dovrebbe
intercettare il tutto.

In assenza di connessione di rete lo script solleva giustamente
un'eccezione quando non riesce più ad accedere alle cartelle di rete, a
quel punto il mio handler di logging tenta di inviare una mail che a sua
volta fallisce. A questo punto il programma esce brutalmente.
La domanda è: perché esce? non dovrebbe essere intercettato dall'except?
Inoltre perché l'eccezione sollevata è doppia?
Vi posto alcune parti del codice, sarò grato a chi mi da qualche
suggerimento...

Di seguito le eccezioni sollevate

ERROR:root:Errore nell'invio della mail
> Traceback (most recent call last):
>   File
> "c:/Users/User/Dropbox/Python/DropboxSyncCheck/lib/DropboxSyncCheck/run.py",
> line 106, in send_mail
>     smtp = smtplib.SMTP_SSL(host, str(port))
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 1031, in __init__
>     source_address)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 251, in __init__
>     (code, msg) = self.connect(host, port)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 336, in connect
>     self.sock = self._get_socket(host, port, self.timeout)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 1037, in _get_socket
>     self.source_address)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py",
> line 704, in create_connection
>     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py",
> line 745, in getaddrinfo
>     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
> socket.gaierror: [Errno 11001] getaddrinfo failed
> ERROR:root:Errore nell'invio della mail
> Traceback (most recent call last):
>   File
> "c:/Users/User/Dropbox/Python/DropboxSyncCheck/lib/DropboxSyncCheck/run.py",
> line 106, in send_mail
>     smtp = smtplib.SMTP_SSL(host, str(port))
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 1031, in __init__
>     source_address)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 251, in __init__
>     (code, msg) = self.connect(host, port)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 336, in connect
>     self.sock = self._get_socket(host, port, self.timeout)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py",
> line 1037, in _get_socket
>     self.source_address)
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py",
> line 704, in create_connection
>     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
>   File
> "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py",
> line 745, in getaddrinfo
>     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
> socket.gaierror: [Errno 11001] getaddrinfo failed


Questa la funzione per l'invio della mail

>
>  def send_mail(host, port, username, password, fromaddr, toaddrs, msg,
> subject):
>     logger.debug("sending mail")
>     try:   # La clausura except non dovrebbe intercettare l'errore
> nell'invio ?
>         if not port:
>             port = smtplib.SMTP_PORT
>         smtp = smtplib.SMTP_SSL(host, str(port))  # riga che solleva
> l'eccezione di tipo socket.gaierror: [Errno 11001] getaddrinfo failed
>         if username:
>             smtp.login(username, password)
>         body = ""
>         for row in msg:
>             body += f"{row}\r\n"
>         mail_msg = MIMEMultipart()
>         mail_msg['From'] = fromaddr
>         mail_msg['To'] = ','.join(toaddrs)
>         mail_msg['Subject'] = subject
>
>         mail_msg.attach(MIMEText(body, 'plain'))
>         smtp.sendmail(fromaddr, toaddrs, mail_msg.as_string())
>         smtp.quit()
>         return True
>     except Exception:
>         logger.error("Errore nell'invio della mail ", exc_info=True)
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20181029/aab8d888/attachment.html>


Maggiori informazioni sulla lista Python