2017-04-03 61 views
2

我想实现误差通过获取图书馆的smtplib当遇到这样的错误,以发送电子邮件在Python 3脚本处理..Python 3的错误处理同时运行尝试和除

if value.isdigit() : 
    print ("Value is an integer") 
else : 
    try: 
     server = smtplib.SMTP(email_server, email_port) 
     server.ehlo() 
     server.starttls() 
     server.login(email_login, email_pass) 
     server.sendmail("[email protected]", "[email protected]", message) 
     server.close() 
     sys.exit() 
    except: 
     print ("Error - Was unable to send email") 
     sys.exit() 

这如果值是一个整数,则工作正常;但如果不是,则电子邮件会正确发送,但错误消息也会打印到屏幕上。

为什么我的脚本也运行except部分?

+2

在您的异常处理代码中添加对'traceback.print_exc()'的调用,以找出引发了什么异常(这是为什么except部分正在执行)。 –

+2

从[docs](https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.quit)猜测你可能意味着'server.quit()'而不是'server.close ()'? – asongtoruin

+3

您可能正在从'sys.exit'中捕获'SystemExit'异常 – VPfB

回答

4

sys.exit是通过引发异常来实现的。在server.close之后调用sys.exit时,该SystemExit异常被捕获。

这里是一个小的证明:

import sys 

try: 
    print("hello") 
    sys.exit() 
except: 
    print("exception!") 

异常处理的基本规则没有听从。应该使用至少except Exception:。更好地except Exception as err:err记录或打印。最好的办法是只处理源自try/except守护的SMTP事务的异常。

+0

我甚至需要sys.exit吗?它是否已达到除外的事实意味着程序将终止? – fightstarr20

+0

@ fightstarr20你正在做一个'sys.exit()',不管是否有例外 - 为什么不把它放在'try ... except ...'loop之外? – asongtoruin

+0

@ fightstarr20'sys.exit()'最好与错误代码一起使用,0代表成功,非零代表失败。这对于在脚本中的使用很有用。 – VPfB