00:00
接下来我们来介绍一下scla当中的异常处理机制,那这章的内容呢,相对来讲比较少,也会比较简单,因为整体上语法和底层处理机制跟Java是非常类似的,但是里边呢还是有一点小细节有所不同,所以我们对它还是要有所了解的。首先我们先来回顾一下Java的异常处理机制是怎么做的,那Java里边的异常处理我们都知道,就是一个try catch try里边包包括了所有有可能抛出异常的代码块,然后在外边呢做一个异常的补货,如果当前的异常有可能出现不同类型的话,那就是先CATCH1种类型啊,如果catch不到的话,再去继续catch下面其他的类型啊,里边每一个catch子句里边代码块就是我们要去处理异常的代码块,最后呢,还可以加一个finally finally就是不管有没有异常。
01:00
啊,最后一定要执行的代码块啊,所以整个我们总结一下的话,Java语言做异常处理就是try catch finally这样的一个原则,不管有没有捕获异常,最后都执行finally,那所以一般情况在这里可以去做一些释放资源的操作,另外就是说多个catch可以分别捕获对应的不同类型的异常,那我们一般情况呢,是把范围小的更为精确的异常写在前面,那范围大比较普遍的异常写在后边,这样的话就可以精准定位啊,那否则直接就会引起编译异常啊,大家需要注意这些要点,那在scla里边呢,整体来讲写法都差不多啊,之前我们其实在代码里边也见过scla当中的异常写法啊,就是关于。我们在for循环,如果想要退出的时候,或者说呃,直接想要在这个循环体里边啊,退出当前循环的时候,我们说SKY里边没有break关键字,那怎么实现呢?就是用异常去实现的,我们当时写的时候也是用了一个try catch,只不过呢,下面是用了一个case语句去做捕获,而且后面还很奇怪的有一个箭头,当时可能不太理解,现在我们讲过了模式匹配之后就会发现啊,它的异常处理其实就是try catch里边做了一个。
02:25
模式匹配就是把不同的情形做了一个检测,呃,所以我们看一下SC里边异常处理的语法,同样是try catch try里边包含有可能抛出异常的代码,然后接下来catch里边呢,大家看catch,这里边就不是所有都是catch子句了啊,Catch就是一个关键字,下边的所有的内容都是都是catch的内容。里边进行区分的时候呢,是用case关键字做不同类型异常的区分的,所以这就有点像我们之前讲到的,按照类型去做匹配的这样的一个模式匹配啊,那同样我们可以有不同的子句对应不同类型的异常,那么我们一般也是把精度比较比较精确,范围比较小的异常放在前面,因为我们知道模式匹配的顺序也是从上到下匹配到了之后就不会执行下面的内容了。
03:20
同样在catch之外,最后还有一个finally finally也是到最后一定会去执行的代码啊,那所以这里大家需要注意的一点就是scla基本上工作机制跟Java是一样的,语法细节呢用到了模式匹配。另外底层机制最大的一个不同就是。Scalela当中没有所谓的受检异常的概念,也就是没有编译器异常,Skyla当中所有的异常都是在run态运行时的时候捕获处理的啊,这是跟Java最大的不同诶,之前大家写Java代码可能也会有这样的一个困扰啊,就是说Java里边的受检异常呢,它尽管可以保证我们代码运行的一个健壮性,但是往往程序员就会比较痛苦,那就是我们总要去考虑怎么样去捕获异常,怎么样去处理它,Skyda里边干脆直接把这个概念删掉了,所有的异常都是运行式捕获。
04:17
那么另外还有一点就是在SC当中,我们也可以用throw关键字去主动的抛出一个异常,那所有异常呢都是able的子类,那throw表达值表达式是有返回值的,那之前我们也说过。返回值就是一个nothing,所以之前我们说在呃,定义这个数据类型的时候,有一个nothing类型,它表示什么都没有,主要就是用在用在。一个函数,一个方法,它总是会抛出异常,不能正确的返回结果的时候,我们就定义它的返回值类形式nothing啊,这就是之前我们讲到的跟异常相关的内容。当然了,Java里边还有一个throw关键字,可以用来声明异常,我们在方法定义的时候就直接把异常声明出来,那同样在SC里边呢,也可以做类似的操作,那么它用的呢,不是throws关键字,而是用了一个throws注解,跟Java的throws用法基本上一样啊。那接下来我们还是在代码里边做一个简单的测试。
05:24
呃,接下来我们新建一个。Package after。909,那剩下的几章内容,其实我们要做的测试都比较少,所以我们就都放在一起吧,09PLUS。接下来我们首先要做的是用一个。OBJECT01要测试的是GALA的异常机制,那按照我们的定义,首先就是TRY,那后边就是H,我们先把这个主体流程写出来,最后是I是我们的代码主体流程,然后接下来我们先定义一个有可能抛出异常的一段代码,那这个最简单的我们能想到的自然就是。
06:14
整数除法的时候,我们知道不数不能为零,如果要直接除以零的话,要抛出一个算术异常了,那所以这里边,但是里边是模式匹配的写法case,然后。我们注意这个叫e in的类型,我们定义一个算数异常,然后后面是一个箭头啊,之前我们在贝壳具体的实现抛出异常的时候,箭头后边什么都不做,哎,那直接控制就可以了,那现在呢,我们可以直接可以直接打印一行我们说。发生转数异常,当然了,我们也可以考虑其他的一些case,比方说我们就一般的一个exception吧,这个范围大一点。
07:07
这边我们就把它叫做发生一般异常。这就是我们最简单的一种处理的方式,呃,那最后在这个final里边,我们也可以直接打印一条信析,这里边是物理结束,我们现在可以运行一下,呃,当然大家知道现在就不会直接。报异常退出了,而是发生异常的时候会到这里做一个补货,我们首先发现它就是一个算术异常,除数为零嘛,所以就直接打印了发生算术异常,另外final里的代码一定会执行,所以执行了一句处理结束,哎,那或者如果这里边我们并没有一个算数异常出现,没有异常出现的话,那就不会进入到catch代码块里边,直接就处理结束了啊,这是我们关于异常的一个处理和测试。
我来说两句