Попробуйте написать try catch на Голанге

задняя часть Go
Попробуйте написать try catch на Голанге

Это 30-й день моего участия в Gengwen Challenge.Подробности о мероприятии, пожалуйста, проверьте:Обновить вызов

Если ❤️моя статья оказалась полезной, ставьте лайк и подписывайтесь. Это самый большой стимул для меня продолжать техническое творчество.Больше предыдущих статей в моей личной колонке

Попробуйте написать try catch на Голанге

предисловие

Язык Golang имеет много преимуществ: статическая компиляция, сопрограммы и высокая производительность, сравнимая с языком C. Но есть и кое-что возмутительное - часто высмеиваемое五行代码,三行错误处理Метод обработки ошибок исключений, при которых возникают следующие проблемы

func readFile(path string) ([]byte, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    return ioutil.ReadAll(file)
}

функцияreadFileФункция состоит в том, чтобы прочитать содержимое указанного файла и вернуть его, а также немедленно сообщить вызывающей стороне при возникновении ошибки. Согласно парадигме программирования Golang, каждая функция, которая может вызвать ошибку, должнаerrorВ качестве последнего возвращаемого значения везде в коде Golang есть операторы «if err != nil».五行代码,三行错误处理анекдоты так популярны в кругу

Можно попробовать поймать

Когда я использовал языки программирования Python и PHP, я к этому привык.try catchСпособ обработки исключений. Итак, для ГолангаИспользование управления процессом с помощью panic() и recovery() всегда вызывало недовольство., чтобы чувствовать себя комфортно в будущем, давайте сделаем это сегодняtry catchобработка ошибок исключений

Язык Голанг имеетrecover()функционировать как宕机恢复机制, пусть программа возобновит работу в горутине в неработающем процессе.

Таким образом, мы можем использоватьrecover()появляется ли функция в программе钩子. Когда возникает исключение, он вызывает наш обработчик исключений. Первая простая реализация:

package main

import "fmt"

func try(userFn func()) {
	defer func() {
		if err := recover();err != nil{
			fmt.Printf("程序执行发生异常: %v\n", err)
		}
	}()

	userFn()
}

func foo(num int)  {
	if num < 10 {
		panic("number is less than 10")
	}else {
		panic("number is greater than 10")
	}
}

func main()  {
	try(func() {
		foo(9)
	})

	try(func() {
		foo(11)
	})
}

go run main.goбегать:

$ go run _test/demo3/test3.go
程序执行发生异常: number is less than 10
程序执行发生异常: number is greater than 10

Как видно из вышеизложенного,recover()функция дополняет нассделай это крючком, роль печати程序执行发生异常Информация.

Добавить метод обработки исключений

Перехват исключений также требует обработки исключений, а не просто их вывода.程序执行发生异常. Поэтому вам также нужно добавить анонимные методы как异常处理方法, модифицированный следующим образом:

func try(userFn func(), catchFn func(err interface{})) {
	defer func() {
		if err := recover();err != nil{
			catchFn(err)
		}
	}()

	userFn()
}

...

func main()  {
	try(func() {
		foo(9)
	}, func(err interface{}) {
		fmt.Printf("程序执行发生异常: %v\n", err)
	})

	try(func() {
		foo(11)
	}, func(err interface{}) {
		fmt.Printf("程序执行发生异常: %v\n", err)
	})
}

Таким образом, вы можете передать все, что хотите自定义处理异常的方法

Суммировать

Вышеупомянутое является простой реализациейtry catch, который до сих пор имеет много дефектов, таких как: не поддерживаетfinallyобработка функций,try catchУпаковка слишком проста. Вот несколько идей, и последующие действия будут улучшены.