Angular集成Power BI自定义错误处理无法获取error.level解决方法
Power BI 嵌入错误事件无法获取level属性解决方案
问题复现
参考微软官方Power BI嵌入自定义错误处理相关文档,在Angular应用的Power BI组件中实现错误监听逻辑,原有设计为通过错误level字段判断是否为致命错误,非致命错误走自动重试逻辑,重试超限后展示错误提示。核心实现代码如下:
this.report.on('error', (event: any) => { const error = event.detail; console.log("event",event) // 非致命错误时记录日志并执行后续处理 if (error.level !== pbi.models.TraceType.Fatal) { console.error(error); if (this.retryCount < this.maxRetryCount) { this.retryCount++; this.isReady = false; setTimeout(() => { this.loadReport(ReportDashboardConfig); }, this.retryCount * 500); } else { this.isError = true; } } })
实际触发错误时,event.detail中不存在level属性,实际返回结构如下:
{ "message": "QueryUserError", "detailedMessage": "Can't display the visual.. Could not render a report visual titled: undefined", "technicalDetails": { "requestId": "Some value here" } }
原因说明
- 核心问题是混淆了Power BI嵌入客户端的两类错误事件:
error事件:上报报表渲染、查询、可视化加载这类非框架级别的普通错误,这类错误本身就不属于致命错误,事件detail不会返回level字段,返回结构就是你实际拿到的格式,包含错误标识、详细提示、请求ID三个核心部分。fatal事件:上报嵌入框架初始化失败、连接断开、鉴权失效这类会导致整个报表完全无法加载的致命错误,只有这类事件的detail会携带level字段,对应pbi.models.TraceType的枚举值。
- 原有逻辑把所有错误都放在
error事件回调里判断level,自然拿不到对应字段。
修正方案
拆分两类事件的监听逻辑,不要在普通error事件中判断level:
- 单独监听
fatal事件处理致命错误,这类错误出现后一般无法通过重载报表恢复,直接展示错误提示即可 - 普通
error事件捕获的都是非致命错误,直接根据业务需求判断是否走重试逻辑即可,不需要校验level字段
修正后的参考代码:
// 处理致命错误 this.report.on('fatal', (event: any) => { const fatalError = event.detail; console.error('Power BI嵌入致命错误:', fatalError); this.isError = true; this.isReady = false; // 可根据fatalError.level做细分处理 }) // 处理普通非致命错误 this.report.on('error', (event: any) => { const commonError = event.detail; console.error('Power BI报表普通错误:', commonError); // 可根据commonError.message过滤不需要重试的错误类型,比如配置类错误重试也无法解决 if (this.retryCount < this.maxRetryCount) { this.retryCount++; this.isReady = false; setTimeout(() => { this.loadReport(ReportDashboardConfig); }, this.retryCount * 500); } else { this.isError = true; } })
补充说明:你遇到的QueryUserError属于查询类错误,常见原因包括数据集权限不足、查询超时、可视化组件配置错误,如果多次重试仍然报错,优先排查报表本身的配置和权限,不要盲目增加重试次数。
内容的提问来源于stack exchange,提问作者schwifty
相关产品推荐
相关产品推荐

