You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:56