异步函数抛出‘One or more errors occurred’异常的原因排查求助
异常原因分析与解决方案
核心问题
你看到的One or more errors occurred.是AggregateException的外层提示,本质是异步任务oReimbursementFactors内部抛出了异常,通过Task.Result访问时被包装成了这个通用错误。结合你的代码和调用链,主要有以下几个关键原因:
1. 同步阻塞异步任务导致异常被包装
你用Task.Run(async () => await ClientApi.GetReimbursementsFactorsAsync(custNo))启动异步任务后,直接通过Result属性同步阻塞等待结果。这种方式会把异步任务内部抛出的任何异常都包裹进AggregateException,掩盖了真实的错误信息,只显示通用的"One or more errors occurred"。
2. 异步调用链中存在未处理的异常
GetReimbursementsFactorsAsync依赖的GetTokenAsync或GetResponseMessageAsync可能抛出了具体异常:
- 网络类异常:比如API请求超时、连接失败、DNS解析错误
- 业务类异常:比如Token获取失败、权限不足、API返回错误状态码(4xx/5xx)
- 序列化异常:API返回的JSON格式不符合预期,反序列化失败
排查与修复步骤
第一步:获取真实异常信息
先在代码中添加异常捕获,拆解AggregateException拿到真实错误:
var dtReimb2 = new Schemas.ReimbursementFactorsSchema.ReimbursementFactorsDataTable(); var oReimbursementFactors = Task.Run(async () => await ClientApi.GetReimbursementsFactorsAsync(custNo)); try { if (oReimbursementFactors.Result.LabourReimbursement.Count > 0) { // 原有逻辑 } } catch (AggregateException ex) { // 遍历内部异常,找到真实错误 foreach (var innerEx in ex.InnerExceptions) { // 输出或记录innerEx.Message和StackTrace Console.WriteLine($"真实错误:{innerEx.Message}"); Console.WriteLine(innerEx.StackTrace); } }
第二步:改用异步await替代同步阻塞
Result属性的同步阻塞不仅会包装异常,还可能在有同步上下文的线程(比如UI线程)中导致死锁。正确的做法是把当前方法改为异步,用await获取结果:
// 方法签名添加async Task public async Task YourMethodName() { var dtReimb2 = new Schemas.ReimbursementFactorsSchema.ReimbursementFactorsDataTable(); var oReimbursementFactors = await ClientApi.GetReimbursementsFactorsAsync(custNo); // 这里如果有异常会直接抛出,无需处理AggregateException if (oReimbursementFactors.LabourReimbursement.Count > 0) { foreach (var reimbursementItem in oReimbursementFactors.LabourReimbursement) { // 新建行逻辑 } } }
第三步:检查异步调用链的错误处理
查看GetTokenAsync和GetResponseMessageAsync的实现,确认是否有未处理的异常场景:
- 比如
GetResponseMessageAsync是否检查了HTTP响应状态码?如果API返回401(未授权)、500(服务器错误),需要手动抛出异常或者处理 GetTokenAsync是否处理了Token请求失败的情况?比如请求超时、返回无效Token- 反序列化过程中是否处理了JSON格式不匹配的问题?
内容的提问来源于stack exchange,提问作者Pepe Ramírez
相关产品推荐
相关产品推荐

