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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:27:11