@
joesonw 然而绝大多数场景就是只有在错误发生的位置抓 stacktrace ,其他层级无脑往上抛。
比如常见的一个服务的调用,展开之后是这个结构:
handler.getCompanyAdminList(companyId) (list, err) {
  // 封装了校验和调用 service
  // ...
  list, err := service.getCompanyAdmin( companyId ) (list, err) {
    // 封装了获取 admin 和拼接 admin 权限
    // ...
    list, err := adminRepo.getCompanyAdmin() (list, err) {
      // 封装了取 cache 和 orm
      // ...
      list, err := orm.getCompanyAdmin() {
        // 封装 db
        list, err := db.select()
        if err!=nil {       1
          // log
          return nil, err
        }
      }
      if err!=nil {          2
        return nil, err
      }
      // ...
      // 其他业务代码
    }
    if err!=nil {             3
      return nil, err
    }
    // ...
    // 其他业务代码
  }
  if err!=nil {               4
    return nil, err
  }
  // ...
  // 其他业务代码
}
只有 1 需要 log ,然后抛出错误到最外层,根据错误直接返回 response 。2 、3 、4 步骤就是无脑略过。