V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
anonymous2351d00
V2EX  ›  问与答

Q: golang 错误处理,我总觉得我写的很怪,不知道怎么改

  •  
  •   anonymous2351d00 · 2023-03-06 18:07:16 +08:00 · 1233 次点击
    这是一个创建于 629 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Intro

    • 萌新刚刚开始写 golang
    • 总觉得哪里怪怪的

    如下代码

    • 数据源
    func Open() (*ent.Client, error) {
    	dsn := fmt.Sprintf("%s:%s@tcp(%s)/ncepu", Option.Username, Option.Password, Option.Address)
    	client, err := ent.Open("mysql", dsn)
    	if err != nil {
    		return nil, err
    	}
    	defer func(client *ent.Client) {
    		err := client.Close()
    		if err != nil {
    			log.Fatal(err)
    		}
    	}(client)
    	return client, nil
    }
    
    • 检测 id 是否存在
    func ExistClientID(clientID string) (bool, error) {
    	client, err := mysql.Open()
    	if err != nil {
    		return false, err
    	}
    	return client.Authorization.Query().Where(authorization.ClientID(clientID)).Exist(context.Background())
    }
    
    
    • 最外层函数
    func PasswordAuthorizationHandler(ctx context.Context, clientID, username, password string) (userID string, err error) {
    	exist, e := service.ExistClientID(clientID)
    	if e != nil {
    		err = e
    		return
    	}
    	if !exist {
    		err = errors.ErrInvalidClient
    		return
    	}
    	uid, e := service.Authorization(ctx, username, password)
    	if e != nil {
    		err = e
    		return
    	}
    	return uid, nil
    }
    

    qeustion

    • 1.这几段代码里的 error 会不会像我想的那样传递到最外层
    • 2.Open()函数中的 defer 这样写很难受,但又不想在每一处都写 defer close
    • 3.请大佬帮忙看看代码,优化优化
    9 条回复    2023-03-07 09:40:45 +08:00
    anonymous2351d00
        1
    anonymous2351d00  
    OP
       2023-03-06 18:09:23 +08:00
    看帖子格式时候又看了一遍代码,好多 nil 没有处理,我好难受
    anonymous2351d00
        2
    anonymous2351d00  
    OP
       2023-03-06 18:10:33 +08:00
    大家看的时候就看个格式吧,别细究业务了,想知道这种 err 和 nil 怎么处理好看
    rimutuyuan
        3
    rimutuyuan  
       2023-03-06 18:31:47 +08:00
    Open 获取 Client 后还能使用吗,defer 里不是 Close 了,我都是在 ExistClientID 中 defer client.close ,错误一般不关心
    webcape233
        4
    webcape233  
       2023-03-06 18:32:42 +08:00 via iPhone
    这个 err 不会外传,难道 ide 没报错?应该 return "" err , 前面那两个可以将 err 写在第一个=语句后用分号分隔
    dobelee
        5
    dobelee  
       2023-03-06 20:46:56 +08:00 via iPhone
    打开的方法里怎么还关闭了?
    none
        6
    none  
       2023-03-06 22:19:13 +08:00
    Open 里打开的 client 在返回之前 close 了,外面根本用不了
    lessMonologue
        7
    lessMonologue  
       2023-03-07 00:11:15 +08:00
    最内层只负责返回数据或者 error ,调用者自行处理错误(打印日志...)。
    anonymous2351d00
        8
    anonymous2351d00  
    OP
       2023-03-07 09:13:14 +08:00
    @dobelee
    @rimutuyuan

    我应该再写一个函数叫 Destroy 在调用层关闭连接,然后再 处理完数据以后在处理数据的函数里关闭链接


    @lessMonologue 好的大佬,我重构一下
    anonymous2351d00
        9
    anonymous2351d00  
    OP
       2023-03-07 09:40:45 +08:00
    @webcape233 还没有试过,理解着是函数后面返回值也可以用?给他们赋值 return 中断函数外面就能收到值了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.