MST

星途 面试题库

面试题:Go中错误和异常的区别及常规处理方式

在Go语言中,简要阐述错误(error)和异常(如panic)的区别,并举例说明如何使用`if err != nil`进行错误处理以及何时使用`panic`较为合适。
28.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

错误(error)和异常(panic)的区别

  1. 错误(error)
    • 性质:Go语言中,error是一种内建接口类型,用于表示函数执行过程中遇到的可预期错误。它是一种常规的错误处理机制,适合在程序的正常流程中处理可能出现的错误情况。
    • 处理方式:通常通过函数的返回值返回error,调用者通过检查返回的error值来决定后续的处理逻辑。
  2. 异常(panic)
    • 性质panic用于表示程序运行时遇到的不可恢复的错误或异常情况,会导致程序立即停止当前函数的执行,并开始展开调用栈。如果没有recover捕获,程序最终会崩溃。
    • 处理方式panic一般用于程序遇到严重错误,例如非法的输入、违反程序的不变量等,这种情况下程序无法继续正常执行。

使用if err != nil进行错误处理的示例

package main

import (
    "fmt"
    "os"
)

func readFileContents(filePath string) (string, error) {
    data, err := os.ReadFile(filePath)
    if err != nil {
        return "", err
    }
    return string(data), nil
}

func main() {
    content, err := readFileContents("nonexistentfile.txt")
    if err != nil {
        fmt.Printf("Error reading file: %v\n", err)
        return
    }
    fmt.Println("File contents:", content)
}

在上述示例中,os.ReadFile可能会返回一个error,通过if err != nil检查,如果有错误,就返回错误信息,调用者在main函数中捕获并处理这个错误,打印错误信息并结束程序。

何时使用panic较为合适

  1. 非法输入
    • 当函数接收到不符合预期的输入,且这种情况无法在正常流程中合理处理时,可以使用panic
    func divide(a, b int) int {
        if b == 0 {
            panic("division by zero")
        }
        return a / b
    }
    
    在这个divide函数中,如果除数为0,这是一个非法输入,无法在正常的除法逻辑中处理,所以使用panic
  2. 违反程序不变量
    • 例如在一个实现栈的程序中,当试图从空栈中弹出元素时,可以使用panic
    type Stack struct {
        data []int
    }
    
    func (s *Stack) Pop() int {
        if len(s.data) == 0 {
            panic("pop from empty stack")
        }
        top := s.data[len(s.data)-1]
        s.data = s.data[:len(s.data)-1]
        return top
    }
    
    这里从空栈弹出元素违反了栈的逻辑,属于不可恢复的错误,适合用panic