Go 1.19.4 错误处理-Day 11

1. 错误处理机制

1.1 先看一段代码,引出Golang错误处理机制

在这里插入图片描述

看到了上面的代码后,思考两个问题?
(1)有没有办法,能让test()执行出错了,它下面的fmt代码依然能够运行。
(2)即使出错,能不能发出提醒,并给出预警机制(如通知到具体的人)。

1.2 关于golang的错误处理

  1. Go在默认情况下,当发生错误后,程序会panic并退出运行(崩溃)。
  2. 如果希望,发生错误后,可以捕获到错误,并进行处理,且保证代码还能继续往下执行。甚至还能再捕获到错误后,给管理员一个提示(邮件、短信等)。
  3. 这里将引出go的错误处理机制。

1.3 基本说明

(1)Go语言追求简洁,所以不支持传统的try…catch…finally这种错误处理机制。
(2)Go中引入的错误处理方式为:defer、panic、recover。
(3)这几个异常使用的场景可以简单理解为:Go中报错一个panic异常,然后defer中通过recover捕获到这个异常,然后进行正常处理。

也就是说,panic、defer、recover三者是结合使用的。

2. 错误处理(panic后继续运行)

2.1 使用defer+recover处理和捕获异常(panic)

package main

import "fmt"

func test() {
	// 定义一个捕获异常的匿名函数
	defer func() {
		err := recover() //  recover是内置函数,可以捕获到异常
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res=", res)
}

func main() {
	test()
	fmt.Println("下面的代码和逻辑:")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe
err= runtime error: integer divide by zero // 报错了
下面的代码和逻辑: // 但是test()函数下面的代码依然执行了,说明程序没有因为panic而崩溃

2.2 错误处理的好处

进行错误处理后,程序不会轻易的挂掉,如果加入预警代码,还能让程序更加的健壮。
如下代码演示:

在这里插入图片描述

3. 自定义错误

在Go中,可以使用errors.New方法和panic内置函数来自定义错误。

  1. errors.New(“错误内容”),会返回一个error类型(是个接口)的值,表示一个错误。
  2. panic内置函数,接受一个any类型的值作为参数。可以接收error类型的变量,输出错误信息,并退出运行。

3.1 案例演示:检测文件名

3.1.1 文件名错误

package main

import (
	"errors"
	"fmt"
)

// 读取配置文件init.conf的信息,如果文件名传入不正确,就返回一个自定义的错误
func readConf(name string) (err error) {
	if name == "init.conf" {
		// 读取
		return nil // nil表示读取成功,没有错误
	} else {
		// 返回自定义错误
		return errors.New("读取文件名错误...")
	}
}

func test() {
	err := readConf("config.init") //这里传入了一个错误的文件名测试
	if err != nil {
		// 如果读取文件失败,就输出错误,并终止程序继续运行。
		panic(err)
	}
	fmt.Println("test函数调用成功,且后续代码继续执行")
}

func main() {
	test()
	fmt.Println("test函数后续的代码!!!")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe
panic: 读取文件名错误...

goroutine 1 [running]:
main.test()
        D:/个人/GO开发/20240624/main.go:23 +0x49
main.main()
        D:/个人/GO开发/20240624/main.go:29 +0x19

3.1.2 正确的文件名

package main

import (
	"errors"
	"fmt"
)

// 读取配置文件init.conf的信息,如果文件名传入不正确,就返回一个自定义的错误
func readConf(name string) (err error) {
	if name == "init.conf" {
		// 读取
		return nil // nil表示读取成功,没有错误
	} else {
		// 返回自定义错误
		return errors.New("读取文件名错误...")
	}
}

func test() {
	err := readConf("init.conf") // 这里改为正确的文件名
	if err != nil {
		// 如果读取文件失败,就输出错误,并终止程序继续运行。
		panic(err)
	}
	fmt.Println("test函数调用成功,且后续代码继续执行")
}

func main() {
	test()
	fmt.Println("test函数后续的代码!!!")
}
============终端执行============
PS D:\个人\GO开发\20240624> go build main.go
PS D:\个人\GO开发\20240624> .\main.exe       
test函数调用成功,且后续代码继续执行
test函数后续的代码!!!
-------------------------------------------------- You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly. -------------------------------------------------- make[4]: Leaving directory '/home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4' touch /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/.built mkdir -p /home/bell/tmp/nvr_2025/torchlight/bin/mstar/packages /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/CONTROL /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/pkginfo install -d -m0755 /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/init.d install -d -m0755 /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/config cp -fpR /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-install/* /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/ for tmp in ; do install -m0755 ./files/$tmp /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/init.d/$tmp; done rm -rf /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/lib64 if [ -n "" ]; then install -m0755 ./files/udhcpd /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/init.d/udhcpd; fi #install -m0755 ./files/wireless_mac.lua /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/usr/sbin/wireless_mac.lua cp -fpR ./files/dhcpd /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/config/dhcpd cp -fpR ./files/dhcpc /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/etc/config/dhcpc find /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox -name 'CVS' -o -name '.svn' -o -name '.#*' -o -name '*~'| xargs -r rm -rf export CROSS="arm-sigmastar-linux-uclibcgnueabihf-" ; NM="arm-sigmastar-linux-uclibcgnueabihf-nm" STRIP="arm-sigmastar-linux-uclibcgnueabihf-strip --strip-all" STRIP_KMOD="/home/bell/tmp/nvr_2025/torchlight/scripts/strip-kmod.sh" /home/bell/tmp/nvr_2025/torchlight/scripts/rstrip.sh /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox rstrip.sh: /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/bin/busybox:executable ( echo "Package: busybox"; echo "Version: 1.19.4-6"; DEPENDS=''; for depend in libc libubus libjson libubox libblobmsg_json libsyslog libiconv-full libsecurity; do DEPENDS=${DEPENDS:+$DEPENDS, }${depend##+}; done; echo "Depends: $DEPENDS"; echo "Provides: "; echo "Source: /home/bell/tmp/nvr_2025/tp_package/u_packages/busybox"; echo "Section: base"; echo "Status: unknown ok not-installed"; echo "Essential: yes"; echo "Priority: optional"; echo "Maintainer: Nicolas Thill <nico@openwrt.org>"; echo "Architecture: mstar"; echo "Installed-Size: 0"; echo -n "Description: "; . /home/bell/tmp/nvr_2025/torchlight/include/shell.sh; getvar V_Package_busybox_description | sed -e 's,^[[:space:]]*, ,g'; ) > /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/CONTROL/control chmod 644 /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/CONTROL/control . /home/bell/tmp/nvr_2025/torchlight/include/shell.sh; (cd /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox/CONTROL; ) ipkg-build -c -o 0 -g 0 /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox /home/bell/tmp/nvr_2025/torchlight/bin/mstar/packages Packaged contents of /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-mstar/busybox into /home/bell/tmp/nvr_2025/torchlight/bin/mstar/packages/busybox_1.19.4-6_mstar.ipk rm -rf /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox mkdir -p /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/stamp /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox install -d -m0755 /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/init.d install -d -m0755 /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/config cp -fpR /home/bell/tmp/nvr_2025/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/busybox-1.19.4/ipkg-install/* /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/ for tmp in ; do install -m0755 ./files/$tmp /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/init.d/$tmp; done rm -rf /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/lib64 if [ -n "" ]; then install -m0755 ./files/udhcpd /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/init.d/udhcpd; fi #install -m0755 ./files/wireless_mac.lua /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/usr/sbin/wireless_mac.lua cp -fpR ./files/dhcpd /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/config/dhcpd cp -fpR ./files/dhcpc /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/etc/config/dhcpc SHELL= /home/bell/tmp/nvr_2025/torchlight/staging_dir/host/bin/flock /home/bell/tmp/nvr_2025/torchlight/tmp/.root-copy.flock -c 'cp -fpR /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox/. /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/' rm -rf /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/tmp-busybox touch /home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/root-mstar/stamp/.busybox_installed make[3]: Leaving directory '/home/bell/tmp/nvr_2025/tp_package/u_packages/busybox' make[2]: *** No rule to make target 'package/tp_package/u_packages/trace_alloc/compile', needed by 'package/tp_package/u_packages/chm/compile'. Stop. make[2]: Leaving directory '/home/bell/tmp/nvr_2025/torchlight' package/Makefile:101: recipe for target '/home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/stamp/.package_compile' failed make[1]: *** [/home/bell/tmp/nvr_2025/torchlight/staging_dir/target-arm-openwrt-linux-uclibcgnueabihf/stamp/.package_compile] Error 2 make[1]: Leaving directory '/home/bell/tmp/nvr_2025/torchlight' /home/bell/tmp/nvr_2025/torchlight/include/toplevel.mk:172: recipe for target 'world' failed make: *** [world] Error 2
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值