Golang中遇到错误时应该如何处理

Golang中遇到错误时应该如何处理

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"path/filepath"

	"gitlab.com/me/myawesomeapp/appconfig"

	yaml "gopkg.in/yaml.v2"
)

func init() {
	filename, err1 := filepath.Abs("config/config.yml") // 使用了错误的包
	if err1 != nil {
		log.Fatal(err1)
	}}
    ...

我没有在 err1 上收到任何错误 - 我应该收到错误吗?


更多关于Golang中遇到错误时应该如何处理的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

filepath.Abs() 与你的应用程序/包结构无关,它只涉及文件路径。

os.Getwd() 返回错误时,它也会返回错误,但仅当路径还不是绝对路径时,正如你在代码中看到的:

https://golang.org/src/path/filepath/path.go?s=6981:7161#L244

更多关于Golang中遇到错误时应该如何处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我的意思是在我的项目 gitlab.com/me/myawesomeapp 中没有 config 包,而是有一个 appconfig 包。因此我应该使用 appconfig

filename, err1 := filepath.Abs("appconfig/config.yml")

我原本预期这里会出现错误。现在我意识到 filepath.Abs 只返回绝对路径,那么 filepath.Abs 会返回什么类型的错误呢?

你所说的"使用了错误的包"是什么意思?filepath 包有一个 Abs() 函数,其签名允许像这样调用,它会根据你提供的相对路径创建一个绝对路径。

我不确定你期望在这里出现什么错误。

func main() {
    fmt.Println("hello world")
}

在Go语言中,filepath.Abs() 函数用于返回路径的绝对路径表示。当传入的路径是相对路径时,它会基于当前工作目录进行解析。如果路径解析成功,err1 将为 nil;如果路径无效(例如包含空字符串),则会返回错误。

在你的代码中,如果 "config/config.yml" 是有效的相对路径,并且当前工作目录正确,err1 可能为 nil,因此不会触发错误处理。但如果你预期该路径应该存在而实际上不存在,filepath.Abs() 本身不会检查文件是否存在,它只进行路径解析。因此,如果文件不存在,err1 仍可能为 nil,但后续操作(如读取文件)会失败。

为了确保文件存在,你应该在调用 filepath.Abs() 后使用 os.Stat() 检查文件状态。以下是修改后的代码示例:

import (
	"log"
	"os"
	"path/filepath"
)

func init() {
	filename, err := filepath.Abs("config/config.yml")
	if err != nil {
		log.Fatal(err)
	}

	// 检查文件是否存在
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		log.Fatalf("配置文件不存在: %s", filename)
	}

	// 继续处理配置文件...
}

如果文件 config/config.yml 不存在,os.Stat() 会返回错误,并通过 log.Fatalf() 终止程序。这确保了在文件缺失时及时处理错误。

回到顶部