如何在Python的SMTPlib中捕获连接超时错误?
出现的错误是:
error: [Errno 110] Connection timed out
我不太明白我应该期待什么?
try:
smtpObj = smtplib.SMTP('smtp.example.com')
smtpObj.starttls()
smtpObj.login('user','pass')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except smtplib.SMTPException('Error: unable to send email"'):
pass
except smtplib.socket.error ('Error: could not connect to server'):
pass
谢谢。
3 个回答
0
OSError 是一个基础类,用来处理一些特定的错误,比如 smtplib.SMTPConnectError(SMTP连接错误)、socket.timeout(套接字超时)和 TimeoutError(超时错误)等。因此,如果你想处理这些错误,最好是捕获 OSError
。
try:
...
except OSError:
...
2
我觉得 socket.error
应该可以用,但如果你把你正在使用的代码发出来,我们可以更好地帮助你。还有 smtplib.SMTPConnectError
也可能对你有帮助。
你可以试试下面这样的代码:
try:
server = smtplib.SMTP("something.com")
except (socket.error, smtplib.SMTPConnectError):
print >> stderr, "Error connecting"
sys.exit(-1)
4
你需要提供异常类,而不是它的实例。也就是说,代码应该像这样:
try:
smtpObj = smtplib.SMTP('smtp.example.com')
smtpObj.starttls()
smtpObj.login('user','pass')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except smtplib.SMTPException: # Didn't make an instance.
pass
except smtplib.socket.error:
pass
第二个异常,smtplib.socket.error
,似乎是捕捉那个错误的合适选择。通常可以直接从套接字模块访问它,方法是 import socket
,然后使用 socket.error
。
注意,我说代码“应该”是这样的,其实有点夸张。当你使用 try
/except
时,想要在 try
块中包含尽可能少的代码,特别是当你要捕捉像 socket.error
这样比较通用的错误时。