Oracle数据库异常捕获中Send_Email函数失效问题求助
问题排查与解决方案
嘿,我立马就发现问题所在啦!你的Send_Email函数里最后一行的mail.send只是引用了邮件发送的方法对象,并没有真正调用这个方法执行发送操作——得给它加上括号,改成mail.Send()才行(Outlook的COM方法通常首字母大写,不过部分环境下小写也能生效,但加括号是必须的)。
另外还有个容易忽略的细节:你把数据库连接代码connection = cx_Oracle.connect(...)写在了try块外面,要是数据库连接本身失败(比如这次遇到的ORA-12514错误),这个异常根本不会被后面的try except捕获,因为连接代码不在try的范围内。建议把连接操作也放进try块里,这样所有数据库相关的异常都能被捕获到。
下面是修正后的完整代码:
import cx_Oracle import pandas as pd def Send_Email(to, cc='', bcc='', subject='', body='', attachment='' ): import win32com.client outlook = win32com.client.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = to mail.CC = cc mail.BCC = bcc mail.Subject = subject mail.body = body if attachment != '': mail.Attachments.Add(Source=attachment) # 核心修正:加括号调用发送方法 mail.Send() try: # 将连接操作移入try块,捕获连接阶段的异常 connection = cx_Oracle.connect('username', 'password', 'hostname:port/SERVICENAME') df = pd.read_sql_query("SELECT * FROM TABLE", connection) except cx_Oracle.DatabaseError as e: Send_Email(to='myemail@email.com', subject='AUTO: Database Error', body=str(e)) except Exception as e: Send_Email(to='myemail@email.com', subject='AUTO: Other Error', body=str(e)) finally: print('Working')
修改点说明
- 在
Send_Email函数最后,把mail.send改成mail.Send(),确保触发邮件发送动作 - 把数据库连接代码移到
try块内部,这样连接失败的异常也能被cx_Oracle.DatabaseError捕获,进而触发邮件通知 - 简化了附件判断逻辑,去掉多余的
pass语句,代码更简洁
这样修改后,无论是数据库连接失败还是查询出错,都会自动给你发送包含错误详情的邮件啦!
内容的提问来源于stack exchange,提问作者Ryan Davies
相关产品推荐
相关产品推荐

