如何修改异常中间件以保证TransferSecondModelData代码持续执行?
解决方案:让循环处理所有记录而不因单条异常终止
核心问题分析
异常中间件的作用是捕获整个请求生命周期内未被处理的异常,一旦它触发,当前请求的执行流程会直接中断,无法回到循环继续处理后续记录。因此不能通过修改异常中间件实现“继续执行”的需求,正确做法是在单条记录的处理逻辑内部捕获异常。
修改方案
在TransferSecondModelData方法的循环中,为SecondModelDataTransfer的调用添加局部异常捕获,处理单条记录的失败情况,同时让循环继续执行:
public async Task<MessageResponseModel> TransferSecondModelData() { List<SecondModel> records = _dbContext.SecondModel.Where(X => X.Transfered == Constants.TO_TRANSFER).ToList(); List<InternalValidationResult> internalValidationResults = new(); foreach (var record in records) { InternalValidationResult internalValidationResult; try { // 尝试处理当前记录的转移 internalValidationResult = await SecondModelDataTransfer(record.DataReceived); // 根据验证结果标记转移状态 record.Transfered = internalValidationResult.AdditionalDetails.IsValid ? Constants.TRANSFER_SUCCESS : Constants.TRANSFER_FAILED; } catch (Exception ex) { // 捕获当前记录处理时的异常,标记为转移失败 record.Transfered = Constants.TRANSFER_FAILED; // 构造包含异常信息的验证结果,便于后续排查 internalValidationResult = new InternalValidationResult { AdditionalDetails = new ValidationDetails { IsValid = false, ErrorMessage = $"记录处理失败: {ex.Message}" // 若有需要,可补充InnerException信息 } // 补充InternalValidationResult的其他必填字段 }; } internalValidationResults.Add(internalValidationResult); } await _dbContext.SaveChangesAsync(); await _db2Context.SaveChangesAsync(); return new MessageResponseModel { StatusCode = StatusCodes.Status200OK, Type = HttpResponses.SUCCESS }; }
为什么不修改异常中间件?
异常中间件处于请求管道的最外层,它捕获异常后会直接生成错误响应并终止当前请求,无法让代码回到循环继续执行。它的职责是处理未被业务逻辑捕获的全局异常,避免请求崩溃,而非控制业务流程中的局部异常处理。
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

