高级错误处理
上下文感知的错误管理
全面的错误处理模式
package main
import (
"context"
"fmt"
"log"
"os/exec"
"time"
)
func executeCommandWithTimeout(command string, timeout time.Duration) error {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
cmd := exec.CommandContext(ctx, "bash", "-c", command)
output, err := cmd.CombinedOutput()
if err!= nil {
if ctx.Err() == context.DeadlineExceeded {
return fmt.Errorf("命令超时: %v", err)
}
if exitError, ok := err.(*exec.ExitError); ok {
return fmt.Errorf("命令执行失败,退出代码为 %d: %s",
exitError.ExitCode(), string(output))
}
return err
}
return nil
}
func main() {
err := executeCommandWithTimeout("sleep 10", 5*time.Second)
if err!= nil {
log.Println("执行错误:", err)
}
}
错误分类策略
graph TD
A[命令执行] --> B{错误类型}
B --> |超时| C[上下文超时]
B --> |退出代码| D[非零退出]
B --> |系统错误| E[执行失败]
错误处理技术
技术 |
描述 |
使用场景 |
上下文超时 |
限制命令执行时间 |
长时间运行的命令 |
详细错误解析 |
提取特定错误信息 |
复杂脚本工作流程 |
重试机制 |
实现自动重试 |
间歇性故障 |
高级错误日志记录与报告
package main
import (
"fmt"
"log"
"os/exec"
"syscall"
)
type CommandResult struct {
Success bool
ExitCode int
Output string
ErrorDetail string
}
func executeAndAnalyzeCommand(command string) CommandResult {
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
result := CommandResult{
Output: string(output),
}
if err!= nil {
result.Success = false
if exitError, ok := err.(*exec.ExitError); ok {
status := exitError.Sys().(syscall.WaitStatus)
result.ExitCode = status.ExitStatus()
result.ErrorDetail = fmt.Sprintf("命令执行失败,退出代码为 %d", result.ExitCode)
} else {
result.ErrorDetail = err.Error()
}
} else {
result.Success = true
}
return result
}
func main() {
result := executeAndAnalyzeCommand("ls /nonexistent")
if!result.Success {
log.Printf("命令执行失败: %s", result.ErrorDetail)
log.Printf("退出代码: %d", result.ExitCode)
log.Printf("输出: %s", result.Output)
}
}
错误处理最佳实践
- 使用上下文进行超时管理
- 实现全面的错误解析
- 记录详细的错误信息
- 必要时创建自定义错误类型
在LabEx,我们强调创建强大的错误处理机制,以便清晰洞察命令执行失败的情况。