go语言发生错误的时候该如何处理?

这是谷歌的代码

conn, err := net.Dial("tcp", "golang.org:80")
if err != nil {
    // handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...

我直接这样写可以吗

if err != nil {
    return
}

我什么都不想做

阅读 4.3k
5 个回答

这要看你在哪里,如果在函数里,就return那个函数要的返回默认值,如果在main里,还是多打一行至少让你自己知道是为啥结束了吧。

长一点的答案应该是这样:需要先设计好你程序是怎么处理错误的,即便全部fail掉,就是你这种纯return的,也要知道为什么死的。一般来说广泛采用的go范式是,函数返回多个值,其中一个是error值,那么你每一层函数遇到问题你就可以细化处理。如果不处理,error就冒泡上去,例:

func demo(input InType) (OutType, error) {
...
  if err != nil {
    return nil, fmt.Errorf("地点,做什么,原因:%v",err)
  }
...
  return res, nil
}

处理的策略也千奇百怪,你可以采用fail,回滚,无视,等等。就看你怎么设计你的程序了。

**一般在C和Go的优雅代码实现里, 都是哪里发生错误, 就给出相应错误信息, 做相应处理, 释放相应的资源, 及时终止执行, 避免if else的累赘嵌套, 保证代码的简洁和优雅, 建议养成良好的编码习惯, 做一个优雅有追求的程序员!**

golang的原则就是 所有错误都要处理,至于你要做什么,怎么做,那都是根据具体的需求逻辑决定的

不想处理也要打个日志出来吧..

go语言的优雅之处在于,它的异常处理是通过多值返回实现的。在go中try..catch这样的异常处理形式是不存在的。这样的设计有利有弊,这样可以让代码在设计知识更加优雅清晰,但是这样也会造成异常无法捕捉难以调试等问题。
因此在go语言开发过程中的最佳实践是,让错误返回交由能够处理的过程进行处理:

import "errors"

func foo(a int) (ret int, err error){
    if success{
        reutrn 0,nil
    }else{
        return 1,errors.New("some error message")
    }
}

可以通过如下方式处理子过程的异常:

if b,err := foo(123); err != nil{
    fmt.Printf("there is something wrong %s",err.Error());
    // release the resources
}else{
    // success logic
}

那么对于你的例子,我的建议是将产生的错误返回,交由上层调用者进行处理:

if err != nil {
    return err
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题