我再次开始使用 Python,但遇到了如何处理函数参数异常的问题。假设有人没有输入 toaddr
或 fromaddr
或 subject
或 body
。或者他们输入 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/