---
name: java-exception-logging
description: Java 异常处理语言层要点。苍穹日志仅 kd.bos.logging.Log；已删除 SLF4J/JCL/DAOException 等冲突示例。
---

# 异常与日志（语言层 · 无冲突）

## 异常（语言）

- 不要吞异常：空 `catch` 禁止
- 捕获后要么处理并记录，要么包装后抛出并 **保留 cause**
- 不要用异常做正常控制流
- `finally` / try-with-resources 释放资源
- 对外错误信息与内部堆栈分离：用户提示用业务语义，日志带堆栈

**苍穹异常类型（平台，非语言包）**：优先 `KDException` / `KDBizException`；禁止用 `RuntimeException` 随便代替业务失败。见 `platform-baseline`、`coding-preferences` STYLE-018。

**已删除**：`DAOException` / `ServiceException` 分层异常体系示例、Spring 事务回滚样板。

## 日志（仅平台）

程序日志 **只允许**：

```java
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;

private static final Log log = LogFactory.getLog(MyClass.class);
// *Ext 插件基类已有 public final Log log 时直接用 this.log
```

业务操作审计：`BizLog.log`（平台）。

**禁止（已从本规范删除一切正例）**：

- `org.slf4j.*` / `LoggerFactory` / `MDC`
- `org.apache.commons.logging`
- 裸 Log4j / Logback API
- `System.out` / `System.err` / `printStackTrace`

## 日志内容习惯（与平台一致）

- 占位符或清晰拼接；debug 前判断级别（若 API 支持）
- 异常：`log.error("场景描述", e)` 带 cause
- 禁止 JSON 序列化整页/大数据包打日志
- 敏感信息脱敏

## 远程调用

- 任何外部 HTTP **必须超时**（平台强制，语言层仅强调原则）

对照：[`../../rules/lang-vs-platform.md`](../../rules/lang-vs-platform.md)
