为了账号安全,请及时绑定邮箱和手机立即绑定

进行错误处理,使事情变干的惯用方法是什么

进行错误处理,使事情变干的惯用方法是什么

Go
12345678_0001 2021-11-22 15:11:26
考虑以下示例程序,它是 Go 中的原始堆栈实现:package mainimport "fmt"import "errors"const MAX_SIZE = 10var a [10]intvar top int = -1func main() {    printStack()    push(1)    printStack()    push(23)    printStack()    pop()    push(2)    push(24)    push(56)    push(87)    push(97)    push(47)    push(37)    push(31)    push(69)    printStack()    push(75)    println("Top element is", getTop())}func push(x int) (int, error) {    if top >= (MAX_SIZE - 1) {        return 0, errors.New("Error: Prevented Stackoverflow. Stack full")    }    top += 1    a[top] = x    return 0, nil}func pop() {    top -= 1}func getTop() int {    return a[top]}func printStack() {    fmt.Println(top+1, "Stack: ", a, "Top", top)}现在,我阅读了错误处理和 Go & 似乎上述返回多个值的方法是在 go 中处理错误的方法。但我不明白的是,地鼠会检查每个语句的错误吗?来自其他语言的这个概念对我来说有点难以理解。所以问题是在上述问题中处理错误的惯用方法是什么?如果我不检查错误是否被认为是一种不好的做法?如果是,那么我应该在push()每次调用它时检查输出?基本上我想知道一个有经验的地鼠如何在上面的程序中进行错误处理?播放网址:https : //play.golang.org/p/_AnZLvY-28[更新] 添加了一个真实世界的程序,我从数据库和输出中获取数据到 json。http://play.golang.org/p/dDApCYprjU
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

是的,产生错误的惯用方法是返回多个值。处理错误的惯用方法是:


val, err := myFunc()

if err != nil {

    // do something with err

}


// do something with val

在一天结束时,这是一个判断电话,但处理错误几乎总是好的做法。您正在编写的代码也有点不寻常,您通常不会对同一个函数进行 10 次背靠背调用,因此您必须执行的详细错误处理更多是原始代码的结果。例如,您可以使用循环:


for _, num := range []int{2, 24, 56, 87, 97, 47, 37, 31, 69} {

    _, err := push(num)

    if err != nil {

        panic(err)

    }

}

不过,您还有一些比不处理推送错误更成问题的事情。一件小事是没有理由push总是返回 0,为什么不仅返回一个错误,而不是一个 int 和一个错误?更大的问题是pop不断递减top,并且getTop只是访问a[top],因此如果top因popped 过多而变得负面,您很容易出现运行时恐慌。您可能需要在您的pop和getTop函数中进行一些错误处理或其他保护措施。


查看完整回答
反对 回复 2021-11-22
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这是在 go-lang 中处理错误的标准方法。发生错误后有两种选择。

1.记录错误并完全退出程序

  1. 记录错误并执行一些相关任务

选项一示例:

func funcX() {

    rtnval, err := funcY()

    if err != nil {

        fmt.Println("error: ", err)

        os.Exit(1)

    }

    //rtnval 

}


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信