面试题答案
一键面试错误(error)和异常(panic)的主要区别
- 错误(error)
- 设计目的:用于表示可预期的错误情况,程序通常可以通过适当的错误处理逻辑来继续运行。例如,文件打开失败、网络连接超时等,这些错误在程序运行过程中是可能经常遇到的,并且程序可以有相应的处理方式。
- 处理方式:通常通过返回值传递错误信息,调用者检查返回的错误并决定如何处理。这种处理方式是显式的,调用者明确知道可能出现的错误情况并进行相应处理。
- 异常(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
抛出一个异常。通过defer
和recover
,在panic
发生后,程序能够捕获异常并进行处理,从而避免程序直接终止,使得main
函数中的后续代码能够继续执行。一般在函数内部遇到不可恢复的错误,且该错误影响到整个程序的逻辑正确性时使用panic
,然后在合适的调用层使用recover
来捕获并处理这个panic
。