# 2026-06-09 — 服务层 ValueError 中文化（str(exc) 透传源头）

## 摘要

将经 API `detail=str(exc)` 透传、且原先为英文的 `ValueError` 文案改为中文，避免 sync/scripts/批量/调度等接口在未走全局 `http_errors_zh` 映射时仍显示英文。

## 动机

待办 #1（API detail 英改中）方案 1：优先改下层异常源头，比统一包装 `raise_api_error` 改动小、语义稳定。

## 涉及文件

| 文件 | 变更 |
|------|------|
| `server/application/services/script_service.py` | `Execution not found` → 执行记录不存在 |
| `server/application/services/server_batch_service.py` | `Unknown batch op` → 未知的批量操作 |
| `server/infrastructure/database/crypto.py` | `Failed to decrypt credential` → 凭据解密失败 |
| `server/infrastructure/ssh/asyncssh_pool.py` | SSH 凭据缺失提示中文化 |
| `server/utils/schedule_cycle.py` | 自定义 cron / 字段数 / 周期类型校验中文化 |
| `server/api/schemas.py` | `batch_id` 校验中文化 |
| `server/infrastructure/redis/script_execution_store.py` | 执行记录不存在提示中文化 |

## 迁移 / 重启

- 无需 DB 迁移
- 需重启 API 进程后生效

## 验证

```bash
pytest tests/test_schedule_cycle.py tests/test_http_errors_zh.py -q
bash scripts/local_verify.sh
```

手动：脚本重试不存在 execution、批量未知 op、调度非法 cycle、推送 batch_id 非法 → 422/400 detail 为中文。

## 未覆盖（后续）

- `f"SSH 连接失败: {e}"` 等库异常后缀（方案 2：`translate_sync_error_message` 包装）
- API 层字面量 `detail="Server not found"`（已由 `http_errors_zh` 全局处理，待部署）
