<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br><div>Ciao a tutti,</div><div>vi chiedo un aiuto perché non riesco a capire che cosa mi sfugge...</div><div>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.</div><div>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.<br></div><div><br></div><div>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.</div><div>La domanda è: perché esce? non dovrebbe essere intercettato dall'except? Inoltre perché l'eccezione sollevata è doppia?</div><div>Vi posto alcune parti del codice, sarò grato a chi mi da qualche suggerimento...</div><div><br></div><div>Di seguito le eccezioni sollevate</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">ERROR:root:Errore nell'invio della mail<br>Traceback (most recent call last):<br>  File "c:/Users/User/Dropbox/Python/DropboxSyncCheck/lib/DropboxSyncCheck/run.py", line 106, in send_mail<br>    smtp = smtplib.SMTP_SSL(host, str(port))<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 1031, in __init__<br>    source_address)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 251, in __init__<br>    (code, msg) = self.connect(host, port)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 336, in connect<br>    self.sock = self._get_socket(host, port, self.timeout)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 1037, in _get_socket<br>    self.source_address)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py", line 704, in create_connection<br>    for res in getaddrinfo(host, port, 0, SOCK_STREAM):<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py", line 745, in getaddrinfo<br>    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):<br>socket.gaierror: [Errno 11001] getaddrinfo failed<br>ERROR:root:Errore nell'invio della mail<br>Traceback (most recent call last):<br>  File "c:/Users/User/Dropbox/Python/DropboxSyncCheck/lib/DropboxSyncCheck/run.py", line 106, in send_mail<br>    smtp = smtplib.SMTP_SSL(host, str(port))<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 1031, in __init__<br>    source_address)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 251, in __init__<br>    (code, msg) = self.connect(host, port)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 336, in connect<br>    self.sock = self._get_socket(host, port, self.timeout)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\smtplib.py", line 1037, in _get_socket<br>    self.source_address)<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py", line 704, in create_connection<br>    for res in getaddrinfo(host, port, 0, SOCK_STREAM):<br>  File "C:\Users\User\AppData\Local\Continuum\miniconda3\envs\DropboxSyncPY3.6\lib\socket.py", line 745, in getaddrinfo<br>    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):<br>socket.gaierror: [Errno 11001] getaddrinfo failed</blockquote><div><br></div><div>Questa la funzione per l'invio della mail</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br> def send_mail(host, port, username, password, fromaddr, toaddrs, msg, subject):<br>    logger.debug("sending mail")<br>    <font color="#990000">try:   # La clausura except non dovrebbe intercettare l'errore nell'invio ?</font><br>        if not port:<br>            port = smtplib.SMTP_PORT<br>        <font color="#990000">smtp = smtplib.SMTP_SSL(host, str(port))  # riga che solleva l'eccezione di tipo socket.gaierror: [Errno 11001] getaddrinfo failed</font><br>        if username:<br>            smtp.login(username, password)<br>        body = ""<br>        for row in msg:<br>            body += f"{row}\r\n"<br>        mail_msg = MIMEMultipart()<br>        mail_msg['From'] = fromaddr<br>        mail_msg['To'] = ','.join(toaddrs)<br>        mail_msg['Subject'] = subject<br>        <br>        mail_msg.attach(MIMEText(body, 'plain'))<br>        smtp.sendmail(fromaddr, toaddrs, mail_msg.as_string())<br>        smtp.quit()<br>        return True<br>    <font color="#990000">except Exception:</font><br>        logger.error("Errore nell'invio della mail ", exc_info=True)</blockquote></div></div></div></div></div>