Go Error Handling: замена шаблона err != nil на panic

Go

Если у вас есть какие-либо вопросы или предложения, добро пожаловать на общение и столкновение во времени. Мой официальный аккаунт [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, микросервисной архитектурой и странным дизайном системы, приглашаю всех обратить внимание на мой официальный аккаунт и пообщаться со мной.

Лучшие отношения - это достигать друг друга, твойкакэтожареная рыбаСамая большая мотивация для творчества, спасибо за поддержку.