MST

星途 面试题库

面试题:Go中错误与异常的区别及常见处理方法

在Go语言中,阐述错误(error)和异常(如panic)的主要区别。并分别举例说明在函数中如何处理一般错误以及何时使用panic和recover机制。
12.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

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

  1. 错误(error)
    • 设计目的:用于表示可预期的错误情况,程序通常可以通过适当的错误处理逻辑来继续运行。例如,文件打开失败、网络连接超时等,这些错误在程序运行过程中是可能经常遇到的,并且程序可以有相应的处理方式。
    • 处理方式:通常通过返回值传递错误信息,调用者检查返回的错误并决定如何处理。这种处理方式是显式的,调用者明确知道可能出现的错误情况并进行相应处理。
  2. 异常(panic)
    • 设计目的:用于表示不可预期的严重错误,这种错误意味着程序处于无法继续正常运行的状态。例如,访问越界的数组索引、空指针引用等,这些情况一旦发生,往往表明程序存在逻辑错误。
    • 处理方式:当panic发生时,程序会立即停止当前函数的执行,并开始展开(unwind)调用栈,直到遇到recover或者程序终止。panic的处理相对隐式,它会打乱正常的程序执行流程。

处理一般错误示例

package main

import (
    "fmt"
)

// 模拟一个可能返回错误的函数
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 2)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Result:", result)
}

在上述代码中,divide函数在除数为0时返回一个错误。调用者在调用divide函数后,通过检查err是否为nil来判断是否发生错误,并进行相应处理。

使用panic和recover机制示例

package main

import (
    "fmt"
)

func someFunction() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    panic("Something went wrong!")
    fmt.Println("This line will not be printed")
}

func main() {
    someFunction()
    fmt.Println("Program continues after recovery")
}

在上述代码中,someFunction函数使用panic抛出一个异常。通过deferrecover,在panic发生后,程序能够捕获异常并进行处理,从而避免程序直接终止,使得main函数中的后续代码能够继续执行。一般在函数内部遇到不可恢复的错误,且该错误影响到整个程序的逻辑正确性时使用panic,然后在合适的调用层使用recover来捕获并处理这个panic