2017-04-03 59 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