1.异常捕获
(0)导言
程序在运行过程中是有出现错误的可能的,而通常情况下程序执行过程一旦出现错误就会中断。
go语言中为了提高程序的可执行性,提出了异常捕获的机制。
异常捕获允许用户通过特殊的写法,当程序运行出现异常时,不去执行错误的代码,
而是转而执行一句没有问题的替代代码,从而避免程序中断。
在go语言中提供了四种异常捕获的手段:errors接口、panic中断、defer延迟调用和recover拦截
(1)errors接口捕获错误信息
在go语言中错误可以分成三大类,分别为【编辑时异常】【编译时异常】【运行时异常】。
1)编辑时异常:代码编写时的硬语法错误,例如少写逗号或者关键词丢失
num int = 100
//丢失var关键字,程序根本不能执行
//错误通常为syntax error前缀,后接错误信息
2)编译时异常:IDE将代码转换为可执行文件时由于逻辑问题导致的错误,例如除数为0
var num int = 10/0;
//除数为0,但是程序从语法上来讲没错误
//错误通常只有单一的错误信息,division by zero
3)运行时异常:程序在运行后出现的错误,例如数组下标溢出
var arr [3]int = [3]int{1,2,3};
for i:=0; i<4; i++{
fmt.Println(arr[i]);
}
//虽然程序从语法结构上来讲没有任何错误
//而且也不存在例如除数为0,下标是负数这种逻辑上的硬错误
//但是程序在执行到i=3的时候就会引发数组下标越界的问题。
//其错误通常使用runtime error前缀,后接错误信息
而go语言提供了一个名为errors的系统包,它专门用来处理当错误发生时的一些问题
可以通过将errors提供的方法放在可能发生异常问题的地方,来避免程序由于出现异常而中断
err := errors.New("错误信息");
eg:
var arr [3]int = [3]int{1,2,3};
for i:=0; i<4; i++{
if(i>2){
err := errors.New("数组下标访问越界了!");
fmt.Println(err);
break;
}
fmt.Println(arr[i]);
}
ps:其实errors包提供的方法也只是一个提示信息,就和正常的输出语句没什么区别。
仍旧需要自己编写逻辑支持,而不能说单独一个方法就能规避异常产生了。
(2)panic异常处理
当程序出现会发生崩溃中断的异常时,系统会自动调用panic函数来对异常信息进行报告。
与errors不同的是errors一般用来报告一些一般性质的错误,这些错误不一定会引发程序崩溃,
而panic则是用来报告当程序遇到不可恢复的错误状态时的错误信息,这些错误一定会引发程序崩溃。
panic(v {}interface);
eg:
fmt.Println("hello1")
panic("hello2")//程序会在此中断,并打印panic:hello2
fmt.Println("hello3")
ps:通常来讲我们不应该使用panic函数来报告一般性质的普通错误