Uber Go 语言编程规范:不要panic

运行在生产环境中的代码必须避免panics。Panics 是 cascading failures 级联失败的主要根源。如果有错误发生,函数必须返回一个错误并且允许调用者决定如何处理它。

Bad

func run(args []string) {
  if len(args) == 0 {
    //直接panic了
    panic("an argument is required")
  }
  // ...
}

func main() {
  run(os.Args[1:])
}

Good

func run(args []string) error {
  if len(args) == 0 {
    //新建一个error
    return errors.New("an argument is required")
  }
  // ...
  return nil
}

func main() {
//调用方判断是否有错误发生
  if err := run(os.Args[1:]); err != nil {
    fmt.Fprintln(os.Stderr, err)
    os.Exit(1)
  }
}

Panic/recover 并不是一个错误处理策略。只有当不可恢复的事情发生时,例如nil引用,程序才必须panic。

这样做的一个例外是程序初始化:在程序启动时发生的应该中止程序的坏的事情,可能会引起恐慌。

var _statusTemplate = template.Must(template.New("name").Parse("_statusHTML"))

即使在测试代码中,也应该优先使用t.Fatal或者t.FailNow,而不是 panic 来确保测试结果被标记为失败。

Bad

// func TestFoo(t *testing.T)

f, err := ioutil.TempFile("", "test")
if err != nil {
  panic("failed to set up test")
}

Good

// func TestFoo(t *testing.T)

f, err := ioutil.TempFile("", "test")
if err != nil {
  t.Fatal("failed to set up test")
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamCatcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值