2014-02-16 2 views
1

Должен ли я не вернуть возвращение из этого метода ниже в конце? Pylint дает ошибку для этого изречения: 3: return statement in finally block may swallow exception (lost-exception)должен вернуться за пределы, наконец, и отлично ли обрабатывается исключение?

def sendMessage(self, subject, msgContent, files, mailto): 
    """ Send the email message 

     Args: 
      subject(string): subject for the email 
      msgContent(string): email message Content 
      files(List): list of files to be attached 
      mailto(string): email address to be sent to 
    """ 

    msg = self.prepareMail(subject, msgContent, files, mailto) 

    # connect to server and send email 
    server=smtplib.SMTP(self.smtpserver, port=self.EMAIL_PORT) 
    server.ehlo() 
    # use encrypted SSL mode 
    server.starttls() 
    # to make starttls work 
    server.ehlo() 
    server.login(self.usrname, self.password) 
    server.set_debuglevel(self.debug) 
    try: 
     failed = server.sendmail(self.mailFrom, mailto, msg.as_string()) 
    except Exception as er: 
     print er 
    finally: 
     server.quit() 
     if failed: 
      return False 
     return True 
+1

Если предположить, что 'failed' является локальным переменным и есть исключение в' sendmail' , тогда 'fail' не будет определен в блоке' finally'. Это предназначено? – Nabla

+0

@ Набла это правильно, его ошибка! –

ответ

1

хорошо, я исправил проблему, @Nabla указал правильный !!

def sendMessage(self, subject, msgContent, files, mailto): 
    """ Send the email message 

     Args: 
      subject(string): subject for the email 
      msgContent(string): email message Content 
      files(List): list of files to be attached 
      mailto(string): email address to be sent to 
    """ 

    msg = self.prepareMail(subject, msgContent, files, mailto) 

    # connect to server and send email 
    server = smtplib.SMTP(self.smtpserver, port=self.EMAIL_PORT) 
    server.ehlo() 
    # use encrypted SSL mode 
    server.starttls() 
    # to make starttls work 
    server.ehlo() 
    server.login(self.usrname, self.password) 
    server.set_debuglevel(self.debug) 
    try: 
     server.sendmail(self.mailFrom, mailto, msg.as_string()) 
    except Exception as er: 
     print er 
     return False 
    finally: 
     server.quit() 
    return True 
1

Это не прямой ответ на ваш вопрос, но если я могу предложить немного отличающуюся реализацию.

Поместите подключение к серверу и разъединения с сервера в двух различных методах:

class MyClass(): 

    serverDict = { 
     "gmail" :"smtp.gmail.com", 
     "hotmail":"smtp.live.com", 
     "yahoo" :"smtp.mail.yahoo.com" 
    } 

    def __init__(self,username,password): 
     self.username = username 
     self.password = password 
     self.serverName = MyClass.serverDict[username[username.index("@")+1:username.index(".")]] 

    def sendMessage(self,subject,msgContent,files,mailto): 
     server = Connect() 
     if not server: 
      return False 
     failed = True 
     try: 
      server.login(self.username,self.password) 
      if not server.sendmail(self.mailFrom,mailto,msg.as_string()): 
       failed = False 
     except Exception,error: 
      print error 
     Disconnect(server) 
     return failed 

    def Connect(): 
     try: 
      server = smtplib.SMTP(self.serverName) 
     except smtplib.SMTPException,error: 
      print error 
      return None 
     try: 
      server.ehlo() 
      if server.has_extn("starttls"): 
       server.starttls() 
       server.ehlo() 
     except (smtplib.SMTPException,ssl.SSLError),error: 
      print error 
      Disconnect(server) 
      return None 
     return server 

    def Disconnect(server): 
     try: 
      server.quit() 
     except smtplib.SMTPException,error: 
      print error 
+0

Это не то, что я искал, у меня уже есть настройка класса таким образом, но у меня возникли сомнения относительно исключения и выхода из метода, основанного на выводе 'pylint' –

Смежные вопросы