首页 > 其他分享 >#yyds干货盘点#【愚公系列】2022年10月 Go教学课程 038-异常处理

#yyds干货盘点#【愚公系列】2022年10月 Go教学课程 038-异常处理

时间:2022-10-03 21:39:40浏览次数:53  
标签:yyds err 10 fmt 038 func error Println panic

一、异常处理

1.什么是异常处理

异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高。

在Go语言中异常处理和其他语言有所不同通过内置的错误接口提供了非常简单的错误处理机制,比如:error、

2.error接口

任意结构体,只要实现了 Error 方法,就可以认为是 error 错误类型。

func New(text string) error {
    return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}

但我们可以用errors.New方法返回,因为errors.New方法实现了error接口的结构体实例。Go提供了两种创建error的方法:

  • errors.New:可以返回错误信息
  • fmt.Errorf:只是打印错误信息

下面是errors.New的使用实例

package main

import (
	"fmt"
	"errors"
)

func main() {
	num,err := TestError(10, 0)
	if err!=nil{
		fmt.Println(err)
	}else{
		fmt.Println(num)
	}
 // os.Open() // ctrl+b 查看go语言自己定义好的方法的源代码。
}
func TestError(num1 int, num2 int) (result int,err error) {
	 err=nil
	if num2 == 0 {
		err=errors.New("除数不能为0")
		return
	}
	result = num1 / num2
	return
}

在这里插入图片描述

3.panic函数

panic是一个Go内置函数,panic的触发有两种:

  • 在运行时遇到错误触发 panic
  • 通过显式直接调用 panic 函数触发 panic
package main

import "fmt"

func main() {
	Test(11)

}
func Test(n int) {
	var num [10]int
	num[n] = 12
	fmt.Println("hhh")
	// 程序员自己不会调用该函数,但是如果程序员自己写的程序中出现了比较严重的异常,那么系统内部会调用该函数,终止整个程序的执行。
	//panic("abc") // 引发异常,从而强制终止整个程序的执行。
	//fmt.Println("hello")
}

在这里插入图片描述

4.3.recover错误拦截

一般在程序运行时不会去捕获panic异常,直接让程序崩溃,查看panic提供的信息,修复异常。在特殊情况,我们还是需要捕获panic,比如在程序发生异常时,释放资源。

在Go语言中,recover只在defer调用的函数中有效,并且defer要在panic之前先注册,否则不能捕获异常。当panic被捕获到后,被注册的函数将获得程序控制权。

package main

import "fmt"

func main() {
	Test(11)
}
func Test(n int) {
	defer TestRecover()
	var num [10]int
	num[n] = 12
	fmt.Println(num)
	fmt.Println("aaaaa")

}
func TestRecover() {
	fmt.Println(recover())
}

在这里插入图片描述 实现其他语言类似异常捕获功能如下:

func Try(fun func(), handler func(interface{})) {
    defer func() {
        if err := recover(); err != nil {
            handler(err)
        }
    }()
    fun()
}

func main() {
    Try(func() {
        panic("test panic")
    }, func(err interface{}) {
        fmt.Println(err)
    })

    // 后续代码可继续执行
    fmt.Println("panic handled")
}

在这里插入图片描述

总结

error和panic区别:

  • error是可预知的,会在代码里会进行合适的处理。
  • panic是不可预知的,又程序进行自动处理异常。

标签:yyds,err,10,fmt,038,func,error,Println,panic
From: https://blog.51cto.com/u_15437432/5730469

相关文章

  • 不扒瞎,这个程序让我从300s优化到了10s
    前天晚上加班完成部门Q4KPI考核计划后,看到业务开发组的几个小伙伴在处理生产问题。我上前了解情况。 销管系统,客户交易明细页面,查询客户交易数据的逻辑是:调用远程数据中心......
  • 10.3小记
    10.3小记poi2015的题都扔在这里了link话说我写这东西好像失去意义了QAQ他唯一的意义是不是用来炫耀猫和犯中二病啊不管我就要炫耀猫我的手机相册经常会自动推荐......
  • #yyds干货盘点#最新前端跨域实践方案
    nginx反向代理接口跨域跨域原理:同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题......
  • 2022-10-03-SpringMVC执行流程梳理及结合源码断点调试过程源码分析
    SpringMVC执行流程梳理接口方式控制器实现流程分析控制器层代码实现控制器配置SpringMVC.xml配置文件客户端浏览器发起请求,按回车前端控制器拦截所有请求/......
  • 2022-10
    2022-1010-03这是第一天,介于今天比赛中我的「惊天地泣鬼神」的表现,决定在这里做一个学习直播,顺带说些东西,人流不会很多也不会很少,加油吧.距离CSP2022-2还有......
  • 2022.10.03考试总结
    2022.10.03考试总结得分:\(140/300\)总结:今天拿了一个暴力分,第二题的暴力因为精度问题没有跑过去,第一题是签到题,在考场上因为担心这道题出现问题所以打了对拍,二三题都有......
  • 【閒話】2022.10.03閒話
    最近繃不住要看書了又到了一波補給大家可以來我宿舍搶奪(什啊最近再切莫反好難啊所以joke您怎麼那麼巨啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊......
  • 【金山文档】集中存放资源共享文件夹-2022年10月3日
     【金山文档】集中存放资源共享文件夹-2022年10月3日  www.kdocs.cn/l/cnSk5MmgUrqa www.autoahk.com/?p=44005  www.cnblogs.com/delphixx/p/16750423.html......
  • Ipyton使用笔记[1003]
    第一次使用:字符串操作   In[1]:lst=[11,12,13,7,1,3,2,2,5,6,10,7]In[2]:lstOut[2]:[11,12,13,7,1,3,2,2,5,6,10,7]In[3]:lst1=[11,12,13,......
  • 10.3
        自定义类:ClassAndObjectTest.java       这两种方式定义变量不同,前一种数据为基本类型integer,变量可以用数值去赋值,即显式初始化,而MyClass......