ASP.NET Core Razor Pages捕获异常后继续foreach循环并记录异常
问题分析与解决方案
核心空引用异常原因
你的catch块中直接对FailedEmails赋值,但该对象从未被实例化,导致空引用异常。此外还有数据库变更未提交的问题,以下是具体修复步骤:
1. 实例化FailedEmails对象
每次捕获异常时,必须创建新的FailedEmails实例,不能直接使用未初始化的变量:
catch (Exception e) { // 每次异常都创建新的实体实例 var failedEmail = new FailedEmails(); failedEmail.StaffID = row.StaffID; failedEmail.FirstName = row.FirstName; failedEmail.LastName = row.LastName; failedEmail.StaffEmail = row.StaffEmail; failedEmail.ExceptionLog = e.Message; failedEmail.SentDate = DateTime.Now; _context.FailedEmails.Add(failedEmail); // 提交数据库变更,确保记录写入 await _context.SaveChangesAsync(); }
2. 提交数据库变更
原代码仅设置了实体状态为Added,但未调用SaveChangesAsync(),导致异常记录无法真正写入数据库。建议每次添加后立即提交,若担心性能可考虑循环结束后批量提交,但后者中途出错会丢失之前的记录。
3. 修复try块中的潜在空引用
try块中多处直接调用Contains()方法,若matrix.StaffEmail、matrix.ManagerEmail为null,会触发空引用异常。需要先判断非空:
// 修改StaffEmail判断逻辑 if (!string.IsNullOrEmpty(matrix.StaffEmail) && matrix.StaffEmail.Contains("@domain.com")) { message.To.Add(new MailAddress(row.StaffEmail)); } // 修改ManagerEmail判断逻辑 else if (!string.IsNullOrEmpty(matrix.ManagerEmail) && matrix.ManagerEmail.Contains("@domain.com")) { message.To.Add(new MailAddress(matrix.ManagerEmail)); } // 同理修改CC和其他判断 if (!string.IsNullOrEmpty(matrix.ManagerEmail) && matrix.ManagerEmail.Contains("@domain.com")) { message.CC.Add(new MailAddress(matrix.ManagerEmail)); } else if (!string.IsNullOrEmpty(matrix.ManagerEmail) && (matrix.ManagerEmail.Contains("N/A") || matrix.ManagerEmail.Contains("NA") || matrix.ManagerEmail.Contains("#N/A") || matrix.ManagerEmail.Contains("na"))) { message.To.Add(new MailAddress(row.StaffEmail)); }
4. 保障循环不中断
当前的try-catch结构已经能实现单个邮件发送失败时不中断循环,修复上述问题后即可正常执行。
优化后的catch块示例
catch (Exception e) { var failedEmail = new FailedEmails { StaffID = row.StaffID, FirstName = row.FirstName, LastName = row.LastName, StaffEmail = row.StaffEmail, ExceptionLog = $"{e.Message}\n{e.StackTrace}", // 建议包含堆栈信息便于排查 SentDate = DateTime.Now }; _context.FailedEmails.Add(failedEmail); // 单独捕获数据库保存异常,避免影响主循环 try { await _context.SaveChangesAsync(); } catch (Exception dbEx) { Debug.WriteLine($"保存失败邮件记录出错: {dbEx.Message}"); } }
内容的提问来源于stack exchange,提问作者Teena
相关产品推荐
相关产品推荐

