Как выдать ошибку при запуске бота на Go, если MySQL выключен?

func Start() {
    dbpool, err := sql.Open("mysql", "root:@/sn")
    if err != nil {
        log.Fatal(err)
    }
    defer dbpool.Close()
    ...
}

Функция Start вызывается в главном main.go, база данных выключена, но скрипт вызовет ошибку, только если будет отправлен запрос сервер (/method/users.get и др.). Мне нужно проверять наличие ошибки при запуске, а не в каждом методе API.


Ответы (1 шт):

Автор решения: dikey0ficial

Есть несколько вариантов:

  1. модифицировать функцию,, чтобы она возвращала ошибку:
func Start() error {
    dbpool, err := sql.Open("mysql", "root:@/sn")
    if err != nil {
        return err
    }
    defer dbpool.Close()
    /* ... */
}

func main() {
    err := Start()
    if err != nil {
        // обработка
    }
}

Этот вариант является общепринятым и рекомендован разработчиками языка

  1. использовать в main() конструкцию recover() и заменить log.Fatal() на panic():
func main() {
    defer func() {
        if e := recover(); e != nil {
            // обработка
        }
    }()
    Start()
 }

Учтите, что вызов panic является крайней мерой при обработке ошибок в Go; он приостанавливает весь рантайм. Также обратите внимание, что log.Fatal под капотом использует не panic, который "мягко" останавливает функции, как return, а os.Exit, "грубо" останавливающий весь runtime. Поэтому его и требуется заменить в таком случае этот метод на panic

→ Ссылка