猿问

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

考虑以下示例程序,它是 Go 中的原始堆栈实现:


package main


import "fmt"

import "errors"


const MAX_SIZE = 10


var a [10]int

var top int = -1


func 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 中处理错误的方法。


但我不明白的是,地鼠会检查每个语句的错误吗?来自其他语言的这个概念对我来说有点难以理解。所以问题是

  1. 在上述问题中处理错误的惯用方法是什么?

  2. 如果我不检查错误是否被认为是一种不好的做法?如果是,那么我应该在push()每次调用它时检查输出?

基本上我想知道一个有经验的地鼠如何在上面的程序中进行错误处理?

播放网址:https : //play.golang.org/p/_AnZLvY-28

[更新] 添加了一个真实世界的程序,我从数据库和输出中获取数据到 json。http://play.golang.org/p/dDApCYprjU


12345678_0001
浏览 118回答 2
2回答

FFIVE

是的,产生错误的惯用方法是返回多个值。处理错误的惯用方法是: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函数中进行一些错误处理或其他保护措施。

收到一只叮咚

这是在 go-lang 中处理错误的标准方法。发生错误后有两种选择。1.记录错误并完全退出程序记录错误并执行一些相关任务选项一示例:func funcX() {    rtnval, err := funcY()    if err != nil {        fmt.Println("error: ", err)        os.Exit(1)    }    //rtnval }
随时随地看视频慕课网APP

相关分类

Go
我要回答