Если у вас есть какие-либо вопросы или предложения, добро пожаловать на общение и столкновение во времени. Мой официальный аккаунт [Brain fried fish], адрес GitHub:GitHub.com/Vicious Genetics.
Некоторое время назад, после того как я поделился статьей «Sneak Peek, The Struggling Road of Go2 Error», у меня состоялся подробный обмен мнениями с другом, и он поделился со мной тем, как их проектная группа изменила способ обработки ошибок Go.
Проще говоря, он используется в бизнес-коде.panic
способ заменить «бесконечный»if err != nil
. Это является предметом этой статьи сегодня, давайте посмотрим, как это сделать, и каковы преимущества и недостатки.
Почему вы хотите заменить
на языке гоif err != nil
Писать много, а объявлять разные методы надо, что хлопотно и неудобно:
err := foo()
if err != nil {
//do something..
return err
}
err := foo()
if err != nil {
//do something..
return err
}
err := foo()
if err != nil {
//do something..
return err
}
err := foo()
if err != nil {
//do something..
return err
}
Приведенный выше пример кода является относительно простым. Если вы занимаетесь инженерной практикой, вам придется прыгать и добавлять различные пакеты.if err != nil
, Вообще говоря, это сложнее, и вы должны заботиться об общем восходящем и нисходящем потоках. Более конкретно вдаваться в подробности не буду, вы можете прочитать мою предыдущую статью.
Как заменить err != nil
не хочу писатьif err != nil
код, один из способов - использоватьpanic
заменить его. Пример кода выглядит следующим образом:
func GetFish(db *sql.DB, name string) []string {
rows, err := db.Query("select name from users where `name` = ?", name)
if err != nil {
panic(err)
}
defer rows.Close()
var names []string
for rows.Next() {
var name string
err := rows.Scan(&name)
if err != nil {
panic(err)
}
names = append(names, name)
}
err = rows.Err()
if err != nil {
panic(err)
}
return names
}
В приведенном выше бизнес-коде мы передаемpanic
способ заменитьreturn err
Функция возвращается, естественно, связанный с ней нижестоящий бизнес-код не нужно писать.if err != nil
код:
func main() {
fish1 := GetFish(db, "煎鱼")
fish2 := GetFish(db, "咸鱼")
fish3 := GetFish(db, "摸鱼")
...
}
при переходе на использованиеpanic
После ошибки механизма режима мы должны увеличить внешний слойrecover
метод:
func AppRecovery() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
if _, ok := err.(AppErr); ok {
// do something...
} else {
panic(err)
}
}
}()
}
}
Каждыйpanic
Затем сделайте утверждение на основе ошибки, которую оно выдает, чтобы определить, настроено ли оно.AppErr
Тип ошибки, если да, то можно выполнить ряд действий по обработке. В противном случае продолжайте движение вверхpanic
бросить наверхRecovery
способ обработки.
Это относительно полноеpanic
Неверная ссылка обработана.
Преимущества и недостатки
-
С точки зрения преимуществ:
-
Общая структура кода выглядит более лаконично, просто сосредоточьтесь на логике реализации.
-
Не нужно сосредотачиваться и писать многословно
if err != nil
код обработки ошибок.
-
-
С точки зрения недостатков:
-
Увеличение когнитивной нагрузки требует, чтобы каждый новый и старый ученик, участвующий в проекте, знал модель и выполнял базовую норму или тренировку.
-
Каждый раз возникает определенное снижение производительности.
panic
В пользовательском режиме есть переключение контекста. -
Существует определенный риск, когда-то
panic
нетrecover
остаться, это приведет к аварии. -
Go официально не рекомендуется, и
panic
противоречит собственному определению, т.е.panic
иerror
путаница понятий.
-
Суммировать
В сегодняшней статье я поделюсь с вами, как использоватьpanic
Способ работы с ошибками Go обязательно имеет преимущества и недостатки, и необходимо найти компромисс.
Внесла ли ваша команда какие-либо новые изменения в обработку ошибок Go? Добро пожаловать, чтобы обменяться и поделиться в области сообщений.
мой публичный аккаунт
Поделитесь языком Go, микросервисной архитектурой и странным дизайном системы, приглашаю всех обратить внимание на мой официальный аккаунт и пообщаться со мной.
Лучшие отношения - это достигать друг друга, твойкакэтожареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.