在 Golang 中处理错误是编写健壮 Linux 应用程序的关键部分。以下是全面的错误处理方法:
result, err := someFunction()
if err != nil {
// 处理错误
return err
}
// 继续正常流程
type MyError struct {
Code int
Message string
}
func (e *MyError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
func someFunc() error {
return &MyError{Code: 404, Message: "Not found"}
}
_, err := os.Open("/nonexistent/file")
if err != nil {
if os.IsNotExist(err) {
// 文件不存在的特定处理
} else if os.IsPermission(err) {
// 权限错误的处理
} else {
// 其他错误
}
}
cmd := exec.Command("non-existent-command")
if err := cmd.Run(); err != nil {
if exitErr, ok := err.(*exec.ExitError); ok {
// 命令执行失败,获取退出状态
status := exitErr.ExitCode()
fmt.Printf("Command failed with status: %d\n", status)
} else {
// 其他错误(如命令不存在)
fmt.Printf("Command execution error: %v\n", err)
}
}
import "errors"
func doSomething() error {
if err := someOperation(); err != nil {
return fmt.Errorf("operation failed: %w", err)
}
return nil
}
// 使用时
err := doSomething()
if errors.Is(err, os.ErrNotExist) {
// 处理特定错误
}
if errors.Is(err, syscall.ENOENT) {
// 处理"无此文件或目录"错误
}
var pathError *os.PathError
if errors.As(err, &pathError) {
// 处理路径相关错误
}
import (
"log"
"log/syslog"
)
func main() {
logger, err := syslog.New(syslog.LOG_ERR|syslog.LOG_USER, "myapp")
if err != nil {
log.Fatal("Cannot connect to syslog")
}
defer logger.Close()
logger.Err("This is an error message")
logger.Info("This is an informational message")
}
import "github.com/sirupsen/logrus"
func main() {
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
_, err := os.Open("/nonexistent")
if err != nil {
log.WithFields(logrus.Fields{
"error": err,
"file": "/nonexistent",
}).Error("Failed to open file")
}
}
fmt.Errorf
或 errors.Wrap
添加上下文信息errors.Is
和 errors.As
处理特定错误类型errors.New
创建简单错误而不是 fmt.Errorf
以提高性能通过遵循这些模式和实践,您可以在 Linux 上构建健壮且易于维护的 Golang 应用程序。