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
相关产品推荐
相关产品推荐

