python - 函数参数的异常处理

标签 python python-2.7 function arguments

我再次开始使用 Python,但遇到了如何处理函数参数异常的问题。假设有人没有输入 toaddrfromaddrsubjectbody。或者他们输入 fromaddr 而不是 toaddr。我如何判断他们输入的是“to”还是“from”?说我愿意:

SendMail('', <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3f594d50527f5a525e5653115c5052" rel="noreferrer noopener nofollow">[email protected]</a>, 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

最佳答案

你有两个选择

  • 验证 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 引发适当的异常

关于python - 函数参数的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026497/

相关文章:

c# - 在 C# 中捕获 python 打印语句

python - 在 Python 中安装包时 pip install tr​​aceback 错误

python - 如何将 panda DataFrame 中的特定范围的元素转换为 float ?

function - 有没有办法避免取消对特征对象的引用?

python - 使用Python按下按键时在功能之间切换

python - Django 。仅为匿名提供缓存内容

Python pafy global 无法跨函数调用边界工作

python - 在 tkinter 的输入框中显示文本的问题

python - Python 导入后自动实例化类

javascript - 我不明白 javascript 中的函数返回