如何在golang中使用运行时错误?

use*_*682 2 runtime http go

我想从3台服务器下载一些东西.我的想法是,如果第一台服务器关闭,它将使用第二台服务器.我注意到,如果第一台服务器已经关闭,它将创建一个运行时错误.我想知道如何使用这个错误,我需要的是这样的:

if run time err!=nil{do something}
Run Code Online (Sandbox Code Playgroud)

我是golang的新手,希望有人能帮助我,谢谢你

val*_*val 8

为了详细说明FUZxxl解释的内容,go区分了一个错误(可能出错的东西确实出错了)和一个异常(一些不可能出错的东西实际上出错了).

区别有时可能是微妙的(因为它依赖于'意外'),但它也可以比你在其他语言中看到的"一切都是例外"更清晰.

例如,考虑可能溢出的整数.一种可能性是将其视为"正常"行为,应该妥善处理:

func safe_add(x, y uint32) (uint32, error) {
    z := x + y
    if z < x || z < y {
        return 0, fmt.Errorf("Integer overflow")
    }
    return z, nil
}
Run Code Online (Sandbox Code Playgroud)

另一个是考虑它"永远不会发生",并且panic在不太可能发生的情况下运行时会遇到所有可能性:

func panic_add(x, y uint32) uint32 {
    z, err := safe_add(x, y)
    if err != nil {
        panic(err)
    }
    return z
}
Run Code Online (Sandbox Code Playgroud)

(注意我在这里使用我自己的'safe_add',但你当然不需要)

主要区别在于您之后处理错误的方式.添加一个数字直到它溢出errors给出:

func safeloop(u uint32) {
    var err error
    for {
        if u, err = safe_add(u, u); err != nil {
            fmt.Println(err)
            return
        } else {
            fmt.Println(u)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

处理恐慌时使用recover内置函数:

func panicloop(u uint32) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    for {
        u = panic_add(u, u)
        fmt.Println(u)
    }
}
Run Code Online (Sandbox Code Playgroud)

(在操场完整例子)

请注意,恐慌版本具有更简单的循环,因为您基本上从不指望出现任何问题并且从不检查错误.与此相对应的是,处理恐慌的方式非常麻烦,即使对于这样一个非常简单的例子也是如此.你defer是一个函数,它会recover在出现错误时调用并捕获错误并突破函数.当您的代码变得更加复杂时,准确跟踪恐慌发生的位置/方式并相应地对其进行操作会比使用该模式检查可能出现的位置中的错误复杂得多result, err := func_which_may_fail(...).

你甚至可以在恐慌之间交替,恢复哪些返回错误,错误转换为恐慌,......但这是(可以理解)被认为是糟糕的设计.

在go go博客上有一些关于错误处理恐慌的好资源.该规范是一个很好看的到.

在您的情况下,正如您所期望的那样"服务器已关闭"是一种非常频繁的行为,您应该error像FUZxxl建议的那样顺利进行,但我希望这对您(或其他人)了解错误处理的工作方式可能会有所帮助在Go.