异常处理与错误码规范

共 19 题
#

1. 异常处理的分层原则中哪一层捕获、哪一层转译、哪一层兜底?"吞异常"和"异常当流程控制"两类反模式的危害?

A 任何异常都在最内层捕获
B 捕获异常后静默即可
C 业务层捕获可恢复、边界层转译、框架层兜底;吞异常应记录/传播,异常当流程控制应改用条件/Result ✓ 正确答案
D 用异常判断正常业务分支
#

2. 统一错误码体系如何设计(业务码/系统码/HTTP 状态码的映射与分段规划),错误码字典如何集中定义、版本化与文档化?

A 错误码散落各处,各自定义
B 前端用 HTTP 状态码做精细分支
C 分段规划业务码/系统码,映射 HTTP 状态码,错误码字典集中定义、版本化并文档化,前端用 code 分支 ✓ 正确答案
D 错误码无需版本化
#

3. "异常即流程控制"的反模式如何识别,如何用 Result/Option 类型重构?

A 用异常处理正常业务状态
B 全部用异常
C 识别"用异常处理正常状态/频繁抛异常",用 Result/Option 显式表达可预期失败,异常保留给不可预期/类型化错误 ✓ 正确答案
D 全部用 Result,禁用异常
#

4. 异常吞噬(Swallowed Exception)与"记录后继续"的边界在哪里,如何设计合理的降级?

A 吞异常(不记录不处理)是反模式;降级是"非关键失败记录后继续",需明确降级策略、记录日志、可配置且隔离 ✓ 正确答案
B 吞异常与降级相同
C 所有异常都静默
D 降级无需记录
#

5. 异步代码中的异常传播中 Future/Promise、回调与事件循环下异常如何捕获与传递,未处理拒绝如何治理?

A 异步异常自动到达调用方
B unhandled rejection 可忽略
C 异步异常无需处理
D 异步异常通过 Future/Promise 失败通道、回调 error、事件循环 unhandled 传播;每个异步链要有错误处理,并全局监听 unhandled 上报 ✓ 正确答案
#

6. 全局错误处理在框架层(Spring @ControllerAdvice、React ErrorBoundary)的统一契约?

A Spring @ControllerAdvice 统一后端错误响应,React ErrorBoundary 统一前端错误展示与上报,形成前后端一致错误契约 ✓ 正确答案
B 每个 Controller 各自 try/catch
C 错误处理只在业务层
D 前端错误无需处理
#

7. 业务错误码与 HTTP 状态码的边界(4xx/5xx 何时用业务错误码)?

A 只用 HTTP 状态码即可
B HTTP 状态码做粗分类(4xx/5xx),业务码做细粒度业务原因,前端主要依赖业务码分支 ✓ 正确答案
C 只用业务错误码
D 一个业务码对应所有状态码
#

8. 受检异常与非受检异常的取舍争论中现代工程(Java/Kotlin/Go error)实践如何收敛?

A 从受检异常强制转向错误值(Result/error)+ 非受检异常兜底;可预期错误用返回值,不可预期用异常 + 全局兜底 ✓ 正确答案
B 受检异常必须保留
C 全部用受检异常
D 全部用非受检异常
#

9. 防御式编程与契约式设计(前置/后置条件、不变式)的边界中过度防御的代码坏味道?

A 所有方法都防御性校验
B 防御越多越好
C 完全不做防御
D 边界防御外部输入,内部用契约(前置/后置/不变式),过度防御(内部重复校验)是坏味道,掩盖 bug ✓ 正确答案
#

10. 错误码与异常体系如何共存,对外 API 返回码、对内抛异常的分层约定,跨层传播时何时转换、何时透传?

A 对外 API 用返回码,对内用异常;业务异常在边界转错误码,系统异常转 5xx,编程错误透传给兜底 ✓ 正确答案
B 所有层都用异常
C 所有层都用错误码
D 每层都转换异常
#

11. 跨服务调用时如何传递错误上下文(错误码、TraceID、业务单据号)?

A 传递错误码(业务语义)+ TraceID(HTTP 头传播,链路追踪关联)+ 业务单据号,形成可追溯错误链 ✓ 正确答案
B 只传错误码
C 错误不跨服务传播
D TraceID 只在单服务内有效
#

12. 如何设计"可恢复错误"与"不可恢复错误"的分类,并据此决定降级、熔断重试与失败传播的边界?

A 所有错误都重试
B 重试无需幂等
C 所有错误都失败传播
D 可恢复错误(瞬时/超时)用重试+熔断+降级,不可恢复错误(参数/规则)失败传播,错误码标 retryable,重试要幂等 ✓ 正确答案
#

13. 空值语义的编码规范中 null、空集合、空字符串的语义区分,以及空指针安全(Optional、空对象模式)如何作为错误处理规范的一部分?

A null 与空集合等价
B 区分 null(无值)、空集合(无结果)、空字符串(空值),用 Optional/空对象模式/@Nullable 显式化空值,避免 NPE ✓ 正确答案
C 空集合返回 null 即可
D 空值无需规范
#

14. 资源清理阶段的异常安全中 finally/RAII 中清理操作抛异常时如何不掩盖原始异常,如何记录与上报?

A 清理异常覆盖主异常即可
B 清理异常忽略
C 清理异常不掩盖主异常(Java try-with-resources 用 suppressed 合并),清理失败记录日志,两者都上报 ✓ 正确答案
D finally 中清理抛异常会破坏主异常
#

15. 异常消息的上下文规范中 message 应包含哪些操作与实体信息,如何与错误码和参数化模板配合,避免敏感信息?

A message 含操作/实体/参数上下文,用参数化模板 + 错误码分类,对外 message 精简无敏感,内部日志含细节 ✓ 正确答案
B message 包含密码和完整 SQL
C message 随便写
D 异常消息不脱敏
#

16. 错误信息本地化与前端可读性的统一规范

A 后端硬编码一种语言 message
B 错误码无需本地化
C 前端直接显示堆栈
D 错误码作为稳定 key,前端按语言渲染本地化文案;后端返回错误码+参数,面向用户文案简洁友好、技术细节进日志 ✓ 正确答案
#

17. 异常信息中敏感数据(堆栈、SQL、PII)泄漏的规范约束?

A 对外响应只返回错误码+精简 message,堆栈/SQL 进内部日志,日志 PII 脱敏,防止泄漏 ✓ 正确答案
B 对外响应返回完整堆栈
C 日志记录完整 PII
D SQL 可出现在对外 message
#

18. 异常的类型设计中自定义异常与继承体系?

A 每个业务场景一个异常子类
B 设计基类(含错误码/状态/上下文)+ 类别(Business/System/Infrastructure),异常类型按类别分层,细粒度用错误码区分 ✓ 正确答案
C 只用标准异常
D 异常继承体系随意
#

19. 异常的性能成本中热路径中构造异常的代价与替代方案(Result/返回码),何时值得优化?

A 所有失败都用异常
B 异常构造有堆栈成本,热路径可预期错误用 Result/返回码替代,不可预期低频保留异常,以测量为准避免过早优化 ✓ 正确答案
C 所有失败都用 Result
D 异常性能无所谓