部分失败需要与整体失败分开表达
别名: 局部失败帧 · partial vs total failure · 分区错误表达
概念解释
一个页面上有多块独立载荷时,失败可以停在一块,也可以停在整页。分区错误表达(partitioned failure expression)要求交付同时给出这两种构图:某一模块请求失败时,其余已成功的模块如何继续可操作;全部关键载荷都失败时,整页怎样宣告并提供重试。只交一张全屏错误,实现会把单模块失败也升级成整页死亡;只交一条模块内提示,整页死亡会被做成角落里的小红字,人以为页面还活着。
它处理的是失败发生在哪一层、这一层在发运包里有没有自己的画面,不是「失败要和空结果长得不一样」——那是另一条区分。也不是在争论局部失败应不应该让整页不可用:这里要的是两套画面都被画出来,供实现按失败范围选用。
机制
实现按已有画面接线。包里若只有全屏错误,模块级 catch 没有视觉终点,最省事的接法是把错误抛到页面根,于是一块天气小组件超时,整张仪表连同已出来的指标一起被换掉。包里若只有模块内横幅,根级失败(鉴权失效、应用壳加载失败)没有构图,实现会把横幅插进一个已经不存在的布局里,或让用户对着空白壳找不到重试。
两套构图的动作落点也不同。模块失败的重试必须贴着那一块,避免误伤邻块;整页失败的重试作用于整次进入。文案的主语不同:「这一栏无法更新」对「现在无法打开这个页面」。混用主语会让人搞错范围,去刷新整页来修一块图,或只点模块重试来修其实已经掉线的会话。交付把范围写进构图,范围才进得了代码。
边界
页面本来就只有一个载荷(一篇文章、一次结账提交),部分失败没有几何可画,整页失败就是那一次失败。后台静默刷新某一块时,失败常常应表现为「仍显示旧数据 + 一块未刷新标记」,那是陈旧内容的表达,不要硬套一张空的模块错误把旧数据盖掉。致命错误(资金操作不确定是否完成)即使只发生在表单的一个字段请求上,也要按整页不确定来交付,因为局部成功的错觉代价更高。嵌入第三方控件、其失败完全不可拦截时,交付应画出「这一嵌块不可用」的壳,而不是假装能给出与自有模块相同的重试。
怎么落地
- 为含两个以上独立请求的页面交出两帧:一帧只让其中一块失败、其余保持可点;一帧让所有关键请求失败、进入整页错误。
- 模块失败帧上只给该块的原因和重试,禁止同时出现整页级的「重新加载应用」。整页失败帧上不要残留可点的、其实已经没数据的模块壳。
- 在帧上标明失败范围的主语(「这一栏」或「这个页面」),文案不得互相借用。
- 分别制造两种故障:断开单一接口、断开全部接口。对照两帧。单接口失败若换上了全屏错误,或全部失败若只在某一卡片里亮了红条,就把缺的那一帧补进交付,而不是只改错误码映射。