【问题标题】:Golang handling nil pointer exceptionsGolang 处理 nil 指针异常
【发布时间】:2014-07-21 02:32:24
【问题描述】:

考虑以下代码:

list := strings.Split(somestring, "\n")

假设这会返回一个包含三个元素的列表或切片。然后,如果您尝试访问切片范围之外的内容:

someFunction(list[3])

程序可能会因为 nil 指针而崩溃。 Golang 中是否有某种方法可以处理 nil 指针异常,从而使程序不会崩溃并且可以适当地响应?

【问题讨论】:

  • 您应该在访问索引之前检查切片len(list) 的长度,这将防止出现越界错误。我不会因为这样的事情而依赖恐慌/恢复(如建议的那样)。
  • @elithrar 访问列表[3] 不应引起零恐慌,它的索引超出范围
  • @elithrar 我有一个相当长的 if 语句列表,每个都期望 list[] 长度不同,所以我在想是否有一些通用的方法来处理异常,例如尝试 catch 或 try except 语句,那么我不需要在每个 if 语句中调用 len() 。虽然听起来 Golang 中没有真正的等价物。
  • 当然,确保它永远不会发生 ;)

标签: pointers go


【解决方案1】:

在 Go 中你不能这样做,即使你可以,你也不应该这样做。

始终检查您的变量和切片,每次您尝试在切片或数组上使用未经检查的索引时,上帝都会杀死一只小猫,我喜欢小猫,所以我个人认为。

解决它非常简单,example:

func getItem(l []string, i int) (s string) {
    if i < len(l) {
        s = l[i]
    }
    return
}
func main() {
    sl := []string{"a", "b"}
    fmt.Println(getItem(sl, 1))
    fmt.Println(getItem(sl, 3))
}

【讨论】:

  • go 中没有异常的教条对优雅的失败是非常有害的。你不能只是“总是检查你的变量”。错误将不可避免地发生,主张人们没有为此做好准备是荒谬的。
  • 我也喜欢小猫。谢谢,从现在开始我会检查我的变量。
【解决方案2】:

Go 有紧急恢复语句,它的工作方式类似于 java 或 c# 中的异常

http://blog.golang.org/defer-panic-and-recover

访问 nil 指针会导致恐慌,如果你不使用恢复来捕捉它,应用程序将崩溃。

但是 go 不鼓励使用 panic/recover 来处理这些异常,你可能应该在使用它之前检查指针是否为 nil。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2016-09-11
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多