Это 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
Упаковка слишком проста. Вот несколько идей, и последующие действия будут улучшены.