2016-12-07 161 views
1

我開始再次使用Python,並且遇到了如何處理函數中的參數異常的問題。說有人不輸入toaddrfromaddrsubjectbody。或者他們輸入fromaddr而不是toaddr。我如何知道他們是否正在接受或來自?說我這樣做:函數參數的異常處理

SendMail('', [email protected], Message, message body) 

這工作監守,我提供了所有的arugments,但是如果我離開toaddr空白,我得到不夠要求的錯誤。

我不認爲我解釋這很好:(

我的功能是這樣的:

def SendMail(toaddr, fromaddr, subject, body, attach=False): 
    # create a MIME(Multipurpose Internet Mail Extension) 
    msg = MIMEMultipart() 

    # assign toaddr, fromaddr and subject to lists 
    msg['To'] = toaddr 
    msg['From'] = fromaddr 
    msg['Subject'] = subject 

    msg.attach(MIMEText(body, 'plain')) 

    # attach a file if set to true 
    if attach == True: 
     filename = raw_input('fullpath/filename.extension>>> ') 
     attachment = open(filename, "rb") 

     part = MIMEBase('application', 'octet-stream') 
     part.set_payload((attachment).read()) 
     encoders.encode_base64(part) 
     part.add_header('Content-Disposition', "attachment; filename= %s" % filename) 

     msg.attach(part) 

    # establish connection to smtp server and send mail 
    try: 
     print('Sending Mail') 
     server = smtplib.SMTP('mail.server.com', 25) 
     text = msg.as_string() 
     server.sendmail(fromaddr, toaddr, text) 
     server.quit() 
     print('Mail Sent!') 
    except smtplib.SMTPException: 
     print("Could not send mail") 
     pass 
    except smtplib.socket.error: 
     print("Could not connect to server") 
     pass 
+0

它沒我看得很清楚,但一切都在這個功能之下。 – NineTail

回答

3

你有兩個選擇

  • 驗證你的論點在SendMail函數並引發合適的異常(例如,ValueError
  • 將無效參數傳遞給server.sendmail fu讓它引發異常,不要抓住它。

無論哪種方式,沒有什麼可以合理地處理異常,所以只需讓它傳播給調用者即可。

考慮一個玩具示例

def divide(a, b): 
    return a/b; 

現在這可以以多種方式被打破:

  • 在零值對於B
  • 在一個字符串傳遞給一個或傳遞b
  • 傳入未定義除法運算符的任何其他類型。

所以,你可以檢查所有這些事情(假設爲INT這隻作品)

def divide(a,b): 
    if not (isinstance(a,int) and isinstance(b,int)): 
    raise ValueError("Arguments must both be integers") 

    if b == 0: 
    raise ValueError("Attempt to divide by zero") 

    return a/b 

或者,你可以離開它是,然後讓Python提高適當的異常