Files
game-driver/pkg/errorsx/handler.go
mapleafgo e4c34f0eec refactor(tts): TTS 极简重构与代码质量提升
## 核心改进

### TTS 模块重构
- 统一 API,仅保留 Sound(ctx, text) 方法
- 优化日志,添加 [TTS] 前缀和结构化字段
- 实现互斥等待:同时只播放一个,新请求等待旧播放完成
- 响应 context 取消:超时或断开时立即停止播放
- 移除全局 context 存储,改为参数传递
- 简化实例化:New(config) 无需传入 context

### 代码质量提升
- 修复 PlayWav/PlayMP3 的死循环 bug(context 取消时缺少 return)
- 修复 standby_ctrl/pause.go 的忙循环(添加 Sleep 避免CPU 100%)
- 添加关键路径错误传播(only_video.go 不再忽略播放错误)
- 新增 pkg/errorsx/handler.go 统一错误处理工具

## 代码优化
- TTS 代码从 234 行精简到 166 行(减少 29%)
- 移除冗余状态管理(playing 标志、等待循环)
- 利用互斥锁的阻塞特性实现优雅等待
- 保持简洁易读的代码风格

## 行为说明
 同时只能播放一个 TTS(互斥)
 新请求等待当前播放完成(不打断)
 响应 context 取消(超时停止)
 日志完善,便于排查问题

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 14:05:16 +08:00

58 lines
1.1 KiB
Go

package errorsx
import (
"fmt"
"go.uber.org/zap"
"runtime/debug"
)
// ErrorHandler 错误处理接口
type ErrorHandler interface {
HandleError(error, string)
}
// DefaultHandler 默认错误处理器
type DefaultHandler struct{}
// HandleError 处理错误并记录日志
func (h *DefaultHandler) HandleError(err error, context string) {
if err == nil {
return
}
// 记录错误信息和调用栈
zap.S().Errorw(
fmt.Sprintf("%s: %v", context, err),
"stack", string(debug.Stack()),
)
}
// Wrap 错误包装,保留调用链
func Wrap(err error, message string) error {
if err == nil {
return nil
}
return fmt.Errorf("%s: %w", message, err)
}
// Must panic 如果 err 不为 nil
func Must(err error, message string) {
if err != nil {
panic(fmt.Sprintf("%s: %v", message, err))
}
}
// LogError 记录错误但不中断
func LogError(err error, context string) {
if err != nil {
zap.S().Errorw(fmt.Sprintf("%s: %v", context, err))
}
}
// LogWarn 记录警告
func LogWarn(err error, context string) {
if err != nil {
zap.S().Warnw(fmt.Sprintf("%s: %v", context, err))
}
}