我再次开始使用Python,并且遇到如何处理函数中参数异常的问题。假设某人未输入toaddr
或fromaddr
或subject
或body
。或者他们输入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
答案 0 :(得分:3)
您有两个选择
ValueError
)server.sendmail
函数,让它引发异常,并且不要抓住它。无论哪种方式,你都无法明智地处理异常,所以只需让它传播给调用者。
考虑一个玩具示例
def divide(a, b):
return 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引发相应的异常