00:00
各位,我们现在来看一下在go浪中,它的错误处理是一个怎么样的机制。那么为了让大家理解错误处理的必要性呢?我们还是老规矩,先给大家看一段代码,看看能输出什么,但先来看这段代码。这段代码呢?这段代码大家注意看一下。他是这样写的这一个主函数。里面调用了一个test。对吧,然后下面呢,有一句话。然后这个test里面做了什么事情呢?我们来看一看。在text里面,他有个NUMBER1,有个NUMBER2,这个都比较简单,然后呢,他做了一件非常有意思的事情,他用NUMBER1去除以NUMBER2。大家都知道NUMBER2是什是什么是零,那大家想想,这个其实就等价于十除以零。大家都知道,我们在小学学数学的时候,老师就说分母。咱们的这个。
01:01
分母是不是它是不能为零的?对吧,所以说他这一定会报一个错误,那么报完这个错误以后,问题就来了。那么在勾浪里边一旦出现了错误,他会怎么处理呢?来,我们来运行一下纠正代码,来一边讲把笔记做一下。错误处理。错误。处理,OK。给他一个标题二。那刚才呢,我们先让大家看了一段代码。引出我们要讲的错误处理。看一段。一段代码。一段代码引出引出错,错误处理。OK。给他一个新的标题,拿一个标题三看这段代码啊,我们一起走一走。呃,因为我们这新建一个,新建一个包吧,新建一个文件夹,那么就叫error。
02:04
好吧,纠结,Error。然后我们写一个文件,叫面点构。呃,然后呢,我们这打一个包package。PACK。Mate。我们引入,我们引入。Pot。For my,然后呢,打一个主函数。好,我们先这样子,因为时间的关系呢,有些地方我就不去写它了,好好吧,直接用这个函数,我们用一下就行了,好吧,没什么大的问题吧。这些都大家都应该能看得懂。很简单的一段代码。诶,这方应该保存一下,可能会出错,大家看。保存一下,看它有没有提示错误。哦,你看这全是错的,这说明什么呀?这说明这个地方应该有特殊的字符,我把它清一下,清掉特殊字符很简单,你就把它全部顶头写,写完了过后再保存一下。
03:06
你看这有没有错了,然后呢,你再格式化一下就行。这地方他报一个什么错误啊,他说。这个地方要用你没有打开对吧,就写完了。这段代码一定会出错,这段代码一定会出错,刚才我们已经分析了,那么我们来试一下,测试一下。如果说我在你调用test,然后呢,我在这个地方再输出一句话might.print。好,我这里显示下面的代码就是men。Main中下面的代码。我们来看看他有机会能执行到下面的代码吗?我们来看在go里边,它一旦出现错误,它会怎么处理来运行一下。进入到刚才我们写的CHAPTER06CD到L目录下面去go run面点go跑起来看效果,我们可以看到当他执行的时候,他根本就没有执行到那去,他直接在这报了错了,大家看第九行。
04:08
第九行还有17行,第九行是哪一行?就这一行,17行就这一行,也就是说从17行进入到这个test里面的时候,在第九行报错了,错误的原因别人也告诉你了,干了什么事,他说integr。呃,By zero,就是你去除了一个零,这是不允许的。报了一个panic panic是什么意思啊?恐慌的意思实际上就是一个错误。实际上就是一种错误,Panic是一个致命的错误,那就直接退出了。那问题来了,问题来了。那么我们有没有一种可能性这样子呢?就是我们现在提出一个问题,假设我希望同学们思考一个问题,即使你这地方出错了,我仍然希望这段代码继续往下执行,这是第一个需求,第二个,即使错了,你能不能告诉我错了,并且给我一个预警的机制。你能不能。
05:04
有没有这样这样的一个方法呢。其实告诉大家,在勾浪里面,它其实也有错误处理机制,那么它的错误激励错误处理机制呢,如果运用起来,其实可以更方便的来让我们代码执行的效率更好,也就说你这错了,我可以保证你错了就错了,但是我下面代码呢,还可以正确执行,这是第一个,第二个如果你错了,我检测到,我还可以发一个邮件或者发一个短信。给谁呢?给我们的管理员说,诶,小新,你的服务器后面有代码错误,那不是更好吗?所以说通这个案例,我们就引出了我们要讲的错误处理机制来,先把这段代码放过来。然后我提出自己的观点。好朋友们先把这块放到这,然后针对这个代码呢,我们做几个总结。啊,我们做几个总结。
06:02
再往上面再小一点。尽量放到一再来一点。对吧,我还不相信你不出来了,好,对上图的总结,对上面。对。上面代码的总结,那么我总结这么几点,第一点。在抱怨的情况下。在默认情况下,当。发生了。发生错误后。当然,一般来讲指的是一个panicle。Panic就是恐慌的意思,发生一个panic是程序。程序。程序就会退出。也就是说,崩溃了。直接就崩溃了。所以就崩溃。崩溃。哦,没法执行的,那么这是第一个他的现象,第二个假设我们有这样一个需求啊,我的需求是这样子的,如果我们希望这样子,如果我们希望怎样呢?我们希望当发生错误后。
07:05
发生错误后,我们可以可以捕获。捕获到该错误。补货。到错误并进行处理,并进行处理。进行处理。啊,保证保证代码。保证代码可以继续线下执行,或者保证我们的程序可以继续执行。对吧,或者说还可以,还可以捕获到这个错误过后呢,给我们的管理员来一个预警机制,还可以干什么呢?还可以再得到。捕获到。捕获。捕获。到错误后给给什么呢?给管理员,给管理员。一个一个提示。一个提示,但是这个提示呢,这个提示有可能是个邮件,也可能是个短信,对吧,可能是邮件形式的邮件。
08:08
邮件。邮件。或者是短信。对吧,或者是短信,那这块呢,我们就想一想怎么处理好,这个时候通过案例呢,就引出我们要讲解的错误处理机制了。这就是引出我们要讲的处理。这里引出。引出。我们要讲的要讲的错误处理。机制好,终于引出来啊,就说我们可以看到,问题是如果你不处理程序直接崩溃。但是实际上呢,有可能就是这个地方错了,那我代码下面这个代码我还想继续执行,这是有可能的呀,所以说我们要去处理这个错误,原因已经说清楚了,那下面我们来看看在go浪里边,它这个错误处理是怎么处理的呢?我们来做一个基本的说明,勾浪语言追求简洁优雅,所以go浪中并不支持传统的try catch finally这种语法。
09:12
如果有同学学过Java就知道Java的错误处理呢?是try catch finally这种方式,但。在勾勒里面呢,他不用这个东西,他觉得这个。并不好,他觉得这个很容易造成程序的混乱。他使用的是什么呢?Diver panic和recover。他是这这样的三个关键字来处理这个错误机制的。那这这几个异常使用的场景可以这么去使用,就是defer panic recover,他们怎么结合使用呢?它是这样子的,告中可以抛出一个panic的异常。就是说当它发生一个错误的时候,他可以抛出一个panic的异常,然后呢,在defer中,注意在一个defer中。通过recover这个内置函数,注意recover是个内置函数,它可以捕获这个异常,然后正常处理。
10:06
那也就是说往往这三者是结合使用的,对不对?好,那现在呢,我们把这个基本说明说到这,我们就来针对刚才这个代码来看看如何处理。如何处理好的基本说明,我们给他一个标题三。对不对,我说了几点啊,说了三点。第一点。我说了,Go里面是没有try catch的。OK,那么在go里面呢,它处理错误处理的时候他用的是deb。Pale。还有什么呢,Recover?这三个结合使用。这三个结合使用好,那同学们看,现在我们有了一些基本知识过后呢,我们就回头来解决这个问题来吧,我们回头来解决这个问题。现在我们使用differ和recover来处理前面的这个异常。
11:02
好,我们来使用。Deer。加谁加recover的形式。Recover。来处理这个错误。处理这个错误。跟着老师思路,那我们看看怎么处理呢?其实非常的简单哈,非常的简单,大家看老师写的代码,我们就针对他的处理,这样处理同学们都知道我们的异常呢,会在这里发生,准确的讲这个异常会在test函数里面发生,能理解吗?这个没毛病吧,就是刚才你们看到这里面它的错误异常其实就是第第九行发生的,也就是说实际上就是test函数里面发生的,是这意思吧,那怎么办好,没问题,我们。使用低倍。Deer加recover的recover的这个结合方式啊,结合来处理异常。
12:02
来补货和处理异常补货。捕获。和处理第三那非常简单,大家看老师这段代码非常简单啊,注意第份。那我这里写一个匿名函,我我直接去调用一个匿名函数。就是说defer后面是个语句,也可以是调用一个函数,对不对,这里面我就直接写个匿名函数了,Function。包起来。括起来,那这个函数里面写什么呢?我这样写,大家看能不能理解。首先我这样写,如果。啊,我这样子啊,我一步一步来说吧,先捕获一个错误error。这样写,呃。怎么写呢?咱们有个recover,看到没有这个recover,这个recover是可以拿到一个error的。这样写大家看懂吗?Recover。能看懂我说一下啊,这个recover可以捕获到一层。
13:04
Recover是一个内置函数。它是一个内置函数,可以捕获到,可以捕获到异常。异常好,那我就判断嘛,我判断一下你个error它有没有错误呢。如果它不等于你。因为ne是它的一个零值,如果它不等于利,说明有错误了。说明有错误。说明捕获到,捕获到。捕获啊,捕获到异常。或者错误,那么现在我把这个错误给它打印出来。好,我打出这个错误异常error等于什么呢?打出来,注意这个是一个匿名函数,你调用没有?大家回忆一下如何调用一个匿名函数。命令函数调用是不是非常简单,括起来就可以了?
14:00
因为你这个并不需要参数嘛,他也没有返回值,这就是调用这份大码能看懂吗。应该能看懂啊,刚才我们讲的defer defer就是把这个函数压入到defer站中,等到他执行完毕或者发生异常的时候,它就会调用这个方式,然后呢,他会把这个异常传给recover recover拿到过后我们进行判断。能理解吧?好,当我加完这段代码过后,你会发现跟前面不一样了。他会因为这就是处理异常,或者这就是处理错误,但它处理完了过后,你会发现下面代码呢,仍然可以正常执行。注意听来,跑一个跑起来。我们看效果。我们可以看到,诶跟前面不一样了,哪里不一样,他把这个错误的打印出来了,过后继续往下走,是不是大家看到main下面的代码也被执行了,如果我这里是一个。是一个循环,你会看到它会不停的执行。大家看这里。
15:01
写啊,不好意思。好,我休眠一下,Time点。Sleep。我休眠一秒钟。time.second。对不对,但是呢,因为我用到sleep,我需要引入一个包包碳包。对吧,诶我就可以大家看,这个时候你们可以看效果跑起来看一下。你看是不是下面代码每隔一秒还在正常执行。看。是不是,所以说这个呢,我们其实就相当于对我们的异常或者错误进行了补货,并且做了处理,那么代码呢,就可以正常往下执行。诶,这就是老师说的这个处理方案,那现在我把这个处理方案给同学们写到这个地方来。至少你的程序不再崩溃了。你的程序不会崩溃了吧?你该怎么走就怎么走。往下接着写26行。截取到第26行。
16:01
没问题吧,这是第26行。那么紧接着呢,我们继续来看。26行往下继续截取。26,那就从27继续截取。好,27行。放到我们的笔记中去。27行整理一下。好的,第27行。完事。这是处理方案,那么现在我们用diver加recover把这个错误处理,呃,进行了这个处理,那么我们来看看这个错误处理它有什么好处呢?来看这里。看到这里错误处理的好处,进行错误处理后程不会轻易的挂掉,如果加入预警代码,就可以让程序更加的健壮。看一个案例,你比如说。大家看这里。大家注意看这里,假如我们希望知道错误发生了,你会我会怎么处理呢?大家看这你是不是在这个地方,实际实际上是可以是可以知道错误发生的,那你就可以加个段代码啊。
17:10
这里就可以将错误这个信息发送给。发送给谁?发送给管理员。对,你可以发送给管理员。那你怎么发送给管理员呢?那当然go里面肯定也有支持这种发送,发送这个信息的这种机制嘛,对吧,我这里写个伪代码,比如说可以这样写。发送邮件,邮件给某某管理员对吧?Adin搜狐点。com不就完了吗?那管理员诶一看,诶有个信息来了,那他就知道我们的程序在哪个地方已经发生崩溃了,或者发生错误了,那这个时候他就会立即来进行处理,对不对?你看我们来跑一下,看看能不能走到这方来。
18:00
看代码。你看邮件给你发送了,下面还在继续执行,那邮件你一看哦,原来有个错误信息是什么什么样子的,把这个信息给他发过来,这个程序员或者管理员一看到赶紧去处理,处理完了不就完事了吗?这个代码对不对,所以说他这个处理呢,就在这可以加入一些预警或者是相应的提示信息给我们的管理员。那它还是有好处的。同学们看到这里这个位置没有第一个它可以保证我们程序并没有崩溃,下面该怎么执行,可以执行,同时呢,我们在捕获到这个error的时候呢,还可以发送信息给管理员,这是这是这样子的啊,还有一点我要提示大家一下,这种写法呢,你会看到有些程序员他还喜欢这样写,大家希望能够看懂他把这句话写到哪呢,剪掉。他直接写到这一栏。这样写大家能看懂吗?是不是我们以前在讲if的时候,我们讲过if前面是可以有一个语句的。
19:01
就是可以做一个语句,这种写法也是OK的,我给大家测试一下,为了表示变化了,我在这加一个波浪号,就这种写法和刚才写法是完全等价的。就看你习惯哪种写法。两种写法都可以来跑一个。大家看到是不是一样可以跑起来,是不是后面有一个波浪号。对吧,OK,我退出。明白这意思吧,就说这点大家可以可以,如果说看到有人这么去写,其实就是跟刚才老师这种写法是完全等价的,就看你自己习惯的一个写法。那么我一般呢,就是还是习惯把它分开写一下,这样子逻辑上更清晰一点,但是合在一起写你也要会,对不对,你也要会。好,那关于我们这个异常的这个好处呢,咱们就把它整理一下。好,我写到这。错误处理的好处。
20:03
整理一下。放在我们的第三号标题,具体来说它可以干什么呢?它可以加入预警代码,可以让我们的程序更加的健壮,是不是好?那我把这块写到这来。OK,好,案例,案例就用这个吧。更合理是事。我们这儿可以加入一些处理代码,就是你要知道你的这个预警的代码或者通知的代码应该写在哪个位置。至少你要知道。写到那儿的。对不对,后面呢,就是怎么去把这个信息发给我们的管理员,那就是后面要讲的相关的其他技术了,比如说发一封电子邮件,或者说发一个短信给我们指定的管理员,不就完事了吗?对不对?好的,我把这放这。别人问到你,比如说面试官问到你,诶如果说我们有个错误发生了,怎么去处理,你得有个方案,有个思路给我们的面试官才可以。好,同学们,那关于错误处理的第一部分内容呢,就给大家先介绍到这里。
我来说两句