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

C#实现错误触发邮件通知功能 运行无报错未收邮件问题排查

代码存在的明显错误
  • 条件判断逻辑完全写反
    catch块中你设置了仅当_configuration == null时才执行发邮件逻辑,但你手动触发异常的场景是在_configuration = new Configuration(xmlMessage);执行成功之后,此时_configuration肯定不为空,发邮件的代码从头到尾都不会被执行。
  • 空引用风险
    就算触发了_configuration == null的分支,你在构造邮件标题时还调用了_configuration.DbName,这里会直接抛出空引用异常,导致发邮件的逻辑中断,同时还会覆盖你原始捕获的异常。
  • 异常栈丢失
    catch块末尾你用throw new Exception("Error Occurred");抛出了新异常,会完全丢失原始异常的堆栈信息、错误内容,非常不利于后续排查问题,正确写法是直接写throw;保留原始异常信息。
  • EmailUtility方法定义缺失实现(潜在问题)
    你贴出的EmailUtility类中的SendEmail方法只有方法签名,没有具体实现逻辑,如果实际代码也只有定义没有实现,方法根本无法正常执行,邮件当然发送失败。
修复后的参考代码
try
{
    _arrivals = new ArrivalsService();
    _configuration = new Configuration(xmlMessage);

    //process summary or detail
    if (_configuration.IncludeHODetails)
    {
        throw new Exception("Include HOH Details is a future feature.");
        //ProcessArrivalDetails(_configuration);
    }
    else
    {
        ProcessArrivalSummary(_configuration);
    }

    UpdateLastRunDate(_configuration.ClientId, _configuration.LastRunDateId, DateTime.Now);
}
catch (Exception ex)
{
    // 不管_configuration是不是空都尝试发邮件,空的话就填默认标识
    string clientDbName = _configuration?.DbName ?? "未知客户端";
    string[] messageTo = new[] { "aaaaaaaaaaaa@gmail.com" };
    
    // 发邮件的逻辑建议也包一层try/catch,避免发邮件本身报错影响主流程异常抛出
    try
    {
        EmailUtility.SendEmail(Util.EMAIL_FROM, messageTo,
            $"Error Running Report Utility for Client: {clientDbName}", 
            $"Error Message: {ex.Message}",
            Util.SMTP_SERVER, false);
    }
    catch (Exception emailEx)
    {
        // 这里可以自行添加日志记录发邮件失败的原因,方便排查
        Console.WriteLine($"发送告警邮件失败:{emailEx.Message}");
    }

    // 保留原始异常抛出
    throw;
}  

内容的提问来源于stack exchange,提问作者justTryingToMakeIt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:48:03