函数参数的异常处理

时间:2016-12-07 20:12:20

标签: python python-2.7 function arguments

我再次开始使用Python,并且遇到如何处理函数中参数异常的问题。假设某人未输入toaddrfromaddrsubjectbody。或者他们输入fromaddr但不输入toaddr。我如何判断他们是否正在往来?说我做:

SendMail('', from@email.com, Message, message body)

这是有效的,因为我提供了所有的句子,但是如果我将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

1 个答案:

答案 0 :(得分:3)

您有两个选择

  • 在SendMail函数中验证您的参数并引发适当的异常(例如ValueError
  • 将无效参数传递给server.sendmail函数,让它引发异常,并且不要抓住它。

无论哪种方式,你都无法明智地处理异常,所以只需让它传播给调用者。

考虑一个玩具示例

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

现在可以通过多种方式解决这个问题:

  • 为B
  • 传递零值
  • 传入a或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引发相应的异常