python中keyerror未捕获是因链式访问中间层为none触发typeerror;go中recover失效因跨goroutine调用;java中nullpointerexception被框架提前拦截;javascript中fetch对4xx/5xx不reject。

Python 中 try-except 捕获 KeyError 却没生效?检查是否漏了嵌套字典的中间层
常见错误现象是:写了 except KeyError:,但访问 data['user']['profile']['age'] 时仍抛出未捕获异常。问题不在 KeyError 本身,而在于 Python 在链式访问中只要任一环节为 None 或非映射类型,就会立刻报 TypeError,根本不会走到最后一层触发 KeyError。
实操建议:
- 用
.get()逐层防御:data.get('user', {}).get('profile', {}).get('age') - 若必须用 try-except,确保整个表达式在单次求值中只可能因缺失 key 报错——比如先确认
data和data['user']存在且为 dict,再单独取data['user']['profile']['age'] - 别依赖
except Exception:掩盖真实错误类型;TypeError和KeyError的修复路径完全不同
Go 的 recover() 在 defer 中不生效?确认是否在 panic 发生的同一 goroutine 里调用
Go 的 recover() 只能在直接引发 panic 的 goroutine 中、且必须在 defer 函数内调用才有效。跨 goroutine 调用(比如在 go func() { recover() }())完全无效,也不会报错,只是静默失败。
实操建议:
- 所有
defer func() { if r := recover(); r != nil { /* 处理 */ } }()必须写在可能 panic 的函数顶部,且不能挪到子 goroutine 里 - HTTP handler 中常见误写:在
http.HandleFunc的闭包里启动 goroutine,然后试图在里面 recover——这注定失败 - 测试时加日志:
log.Printf("panic captured: %v", r),如果日志没输出,大概率是 goroutine 隔离问题
Java catch (Exception e) 捕不到 NullPointerException?检查是否被上层 try-catch 提前吞掉
NullPointerException 是 RuntimeException 的子类,属于 unchecked exception,catch (Exception e) 理论上能捕获。但实际开发中常发现它“消失”了——真正原因是异常在到达你写的 catch 块前,已被框架(如 Spring AOP、Servlet 容器、JUnit)拦截并处理,甚至转成了 HTTP 500 响应后就丢弃了原始堆栈。
实操建议:
- 在 IDE 调试时,打开 “Break on exception” 并勾选
java.lang.NullPointerException,看它最初从哪一行抛出 - 不要依赖全局异常处理器掩盖逻辑缺陷;优先用
Objects.requireNonNull()主动校验入参 - Spring Boot 中若用
@ControllerAdvice统一处理,记得检查其@ExceptionHandler是否配置了NullPointerException.class,否则默认不匹配
JavaScript fetch() 的网络错误进不了 catch?因为 reject 只发生在连接级失败,HTTP 状态码 4xx/5xx 仍走 resolve
这是最常被误解的一点:fetch() 在 DNS 失败、请求被 CORS 阻止、网络中断时才会 reject;但服务器返回 404、502、甚至空响应体,都算“成功响应”,会进 then(),需要手动检查 response.ok 或 response.status。
实操建议:
- 别写
fetch(url).then(...).catch(...)就以为覆盖所有错误;必须加if (!response.ok) throw new Error(...) - 对 401/403 这类业务错误,建议统一封装成自定义 error 类(如
AuthError),便于上层区分处理 - 使用
AbortController控制超时,否则网络卡死时 fetch 会无限挂起,连 reject 都等不到
事情说清了就结束。异常处理不是加个 try 就完事,关键在搞清错误发生的位置、传播路径和拦截层级——这三个地方错一个,后面所有日志、告警、降级都会失灵。










