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