Как выдать ошибку при запуске бота на 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 шт):
Есть несколько вариантов:
- модифицировать функцию,, чтобы она возвращала ошибку:
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 {
// обработка
}
}
Этот вариант является общепринятым и рекомендован разработчиками языка
- использовать в
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