Python与go语言的异常处理

目录

一、Python中的异常处理

常见异常

1.NameError

2. IndentationError

3.IndexError

4.SyntaxError

5.keyError

6.AttributeError

7.ValueError

8.AssertionError

异常捕获机制

1.try...except...

2.else结构

3.finally结构

手动抛出异常

二、go语言的异常处理

内置类型error

panic

recover()函数


一、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]
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值