MST

星途 面试题库

面试题:Go语言中错误与异常的基础区别

在Go语言中,简要阐述错误(error)和异常(如panic)的区别,并且分别举例说明在哪些常见场景下会使用到错误处理和引发异常。
37.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

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

  1. 性质
    • 错误(error):是Go语言中用于表示预期的、可恢复的问题的机制。它通常用于函数调用失败等情况,函数可以通过返回error值来告知调用者发生了什么问题,调用者可以选择合适的方式处理这个错误,比如重试、记录日志等。
    • 异常(panic):用于表示非预期的、不可恢复的严重问题。当发生panic时,程序会立即停止当前函数的执行,并开始展开调用栈,直至找到对应的recover函数(如果有),否则程序将崩溃。
  2. 处理方式
    • 错误(error):调用者需要显式地检查和处理返回的error值。一般通过if err != nil这样的条件判断来决定如何处理错误。
    • 异常(panic):在没有recover的情况下,程序会崩溃。如果在defer函数中使用recover,可以捕获panic并进行相应的处理,但这种情况相对较少,主要用于在程序的关键部分捕获严重错误以避免整个程序崩溃。

常见场景下的使用

  1. 错误处理场景
    • 文件操作:例如打开文件时,文件可能不存在或没有权限访问。
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("nonexistentfile.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        // 可以选择其他处理方式,如创建文件等
        return
    }
    defer file.Close()
    // 后续文件操作
}
  • 网络请求:网络连接可能失败,请求可能超时等。
package main

import (
    "fmt"
    "net/http"
)

func main() {
    resp, err := http.Get("http://nonexistentwebsite.com")
    if err != nil {
        fmt.Println("Error making HTTP request:", err)
        return
    }
    defer resp.Body.Close()
    // 处理响应
}
  1. 引发异常场景
    • 访问越界:当访问数组或切片超出其有效范围时。
package main

func main() {
    var arr [5]int
    // 这里会引发panic,因为索引10超出了数组范围
    arr[10] = 10
}
  • 空指针引用:当尝试通过空指针访问其成员或方法时。
package main

type Person struct {
    Name string
}

func main() {
    var p *Person
    // 这里会引发panic,因为p是nil
    fmt.Println(p.Name)
}