目录
一、Python中的异常处理
Python中遇到错误异常,程序就终止了
print("start...")
#打开test.txt文件,文件不存在会出现异常
#语句出错,程序终止
fp = open("test.txt")
print("end...") #不会执行
常见异常
1.NameError
名称错误,在被访问的标识符未在本地或全局范围内定义时引发,如下图
2. IndentationError
脚本缩进异常时引发,如下图
3.IndexError
索引错误,如下图
4.SyntaxError
语法错误,如下图
5.keyError
字典中不存在所需要的key而引发错误,如下图
6.AttributeError
对象属性错误,如下图
7.ValueError
参数的值不适合而引发错误,如下图
8.AssertionError
断言异常,当 assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常,常用于测试上,如下图
异常捕获机制
1.try...except...
异常发生时不终止程序,做特殊处理
其中:
- except可以有多个,但匹配到第一个就会退出
- 如果捕获的错误异常与触发的错误异常不一致,程序捕获不到,然后会抛出异常
- except默认捕获Exception类,Exception为很多异常类的父类
- 父类异常应放在最后面,如果父类异常捕获放在最前面,就会吞噬后面的所有子类异常捕获
try:
print("start")
int("abc") #ValueError
a = 100/0 #ZeroDivisionError(除数为0)
#捕获内建异常
#匹配到第一个就会退出
except ValueError as e:
#输出原本的错误信息
print(e)
except ZeroDivisionError:
print("除数为0")
#默认捕获Exception类
except:
print("this is Exception")
print("process end...")
运行结果:
2.else结构
没有任何异常发生的时候执行
try:
print("else test...")
int("abc")
except ValueError:
print("value error")
# 发生异常时不会执行
else:
print("else test end...")
运行结果:
3.finally结构
不管有没有异常,不管异常有没有捕获,都会执行
try:
print("finally test...")
int("abc")
except ValueError:
print("value error")
# 无论什么情况都会执行
finally:
print("finally end...")
运行结果:
手动抛出异常
raise关键字--用法:
- raise
- raise 异常类
- raise 异常类(说明信息)
print("raise start")
#抛出索引异常
raise IndexError("超出范围!")
print("raise end")
运行结果:
二、go语言的异常处理
注意:
- go语言中尽量避免抛出异常
- 一般发生的错误,都期望程序员自己处理错误
- 在函数的实现过程中,出现了不能处理的错误,可以返回给调用者处理
例如:
package main
import(
"fmt"
"os"
)
func main(){
//以只读模式打开文件
file, err := os.OpenFile("test.txt", os.O_RDONLY, 666)
//延时语句--其他语句执行完后执行
defer file.Close()
//判断打开文件函数返回的错误信息是否为空,不为空则表示打开文件失败
if err != nil{
fmt.Println("打开文件失败", err)
}
fmt.Println("end...")
}
运行结果:
内置类型error
内置包errors--产生错误对象
package main
import (
"fmt"
"errors"
)
func main(){
//将hello函数的返回值赋值给err
if err := hello(""); err != nil{
//输出错误信息
fmt.Println(err)
}
}
func hello(name string) error{
if len(name) == 0{
//自定义错误 -- 使用errors包
return errors.New("error:name is empty!")
}
fmt.Println("hello", name)
//若name不为空,则返回error的空值nil
return nil
}
运行结果:
panic
- 在go中,error往往是能预知的异常,不能预知的异常在go语言中成为panic
- panic可以手动触发异常,等效于Python中的raise--panic(“异常说明信息”)
package main
import "fmt"
func main(){
//调用get函数,并输出get函数的返回值
fmt.Println(get(8))
fmt.Println("end...") //若上条语句出现异常,该条语句不会执行
}
//获取下标对应的值
func get(index int) int{
arr := [3]int{5, 6, 7}
return arr[index]
}
运行结果:
recover()函数
注意:
- recover()函数用于捕获异常终止处理流程,相当于Python中的try...except
- recover()函数要配置defer使用,它只有在defer调用的函数中才有效
- 如果没有recover,程序出现panic时,这个进程就会退出
package main
import "fmt"
func main(){
//调用get函数,并输出get函数的返回值
fmt.Println(get(8))
fmt.Println("end...")
}
func get(index int) int{
defer func(){
//r为捕获的异常信息
//若r不为空则表示捕获到了异常信息
if r := recover(); r != nil{
fmt.Println("something error!", r)
}
}()
arr := [3]int{5, 6, 7}
return arr[index]
}
运行结果: