MST

星途 面试题库

面试题:Go自定义错误类型与错误处理链

假设你正在开发一个文件读取和解析的Go程序。首先自定义一个错误类型 `FileParseError` 用于文件解析失败的情况。该错误类型需要包含错误发生的具体行号等详细信息。然后在一个函数 `ParseFile` 中,当遇到文件读取错误时,将其包装成 `FileParseError` 错误类型,并且展示如何通过错误处理链将错误信息逐步传递和处理,最终打印出有意义的错误提示给用户。
43.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "os"
)

// 自定义错误类型
type FileParseError struct {
    LineNumber int
    ErrMsg     string
}

func (fpe FileParseError) Error() string {
    return fmt.Sprintf("在第 %d 行解析文件时出错: %s", fpe.LineNumber, fpe.ErrMsg)
}

// 解析文件函数
func ParseFile(filePath string) error {
    data, err := os.ReadFile(filePath)
    if err != nil {
        return FileParseError{
            LineNumber: -1,
            ErrMsg:     fmt.Sprintf("读取文件失败: %v", err),
        }
    }

    // 模拟解析文件内容
    lines := string(data)
    for lineNum, line := range lines {
        // 这里假设如果某一行包含非法字符就认为解析失败
        if line == '?' {
            return FileParseError{
                LineNumber: lineNum + 1,
                ErrMsg:     "发现非法字符",
            }
        }
    }

    return nil
}

你可以使用以下方式调用和处理错误:

func main() {
    err := ParseFile("test.txt")
    if err != nil {
        if fpe, ok := err.(FileParseError); ok {
            fmt.Println(fpe.Error())
        } else {
            fmt.Printf("未知错误: %v\n", err)
        }
    }
}