《Python零基础快乐学习之旅》学习笔记15——程序调试与异常处理

第15章 程序调试与异常处理

15.1 程序异常

15.1.1 除数为0的错误

程序实例:

def division(x, y):
    return x / y

print(division(10,2))
print(division(5, 2))
print(division(3, 0))

执行结果:
在这里插入图片描述

由于最后一行输出中,传入的第2个参数为0,导致出现ZeroDivisionError: division by zero错误。

15.1.2 try/except

使用try/except语句可以捕获异常,它的语法格式如下:

try:
    指令		# 预设可能引发错误异常的指令
except 异常对象1	# 如ZeroDivisionError
	异常处理程序1

try语句按照如下方式工作:

  • 首先,执行try子句(在关键字try和except之间的语句)。
  • 如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。
  • 如果一个异常没有与任何的except匹配,那么该异常将被传递给上层的try中。

一个try语句可能包含多个except子句,分别用来处理不同的特定的异常,但最多只有一个分支会被执行。处理程序只针对对应的try子句中的异常进行处理。

程序实例:

def division(x, y):
    try:                   # try - except指令
        return x / y 
    except ZeroDivisionError:   # 除数为0时执行
        print("除数不能为0!")

print(division(4, 2))
print(division(4, 0))
print(division(3, 2))

执行结果:

2.0
除数不能为0!
None
1.5

如果在执行try子句的过程中发生了异常,但这个异常不是预设的except异常对象,表示异常未被捕捉到,此时依旧会出现错误信息。

程序实例:

def division(x, y):
    try:                   # try - except指令
        return x / y 
    except ZeroDivisionError:   # 除数为0时执行
        print("除数不能为0!")

print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))

执行结果:
在这里插入图片描述

由执行结果可以看出,新出现的异常为TypeError,而在程序中没有设计对应的异常处理程序。因此需要对程序进行扩充。

def division(x, y):
    try:                   # try - except指令
        return x / y 
    except ZeroDivisionError:   # 除数为0时执行
        print("除数不能为0!")
    except TypeError:           # 类型错误
        print("除法数据类型不符!")

print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))

执行结果:

2.0
除数不能为0!
None
除法数据类型不符!
None
1.5

15.1.3 try/except … else

try/except语句还有一个可选的else子句。这个子句在使用时必须放在所有的except子句之后。在try子句中没有发生任何异常时,else子句才会执行。语法格式如下:

try:
    指令			# 预先设想可能引发异常的指令
except 异常对象1:
    异常处理程序1
else:
    正确处理程序	# 没有异常时执行此区块指令

程序实例:

def division(x, y):
    try:                   # try - except指令
        ans = x / y 
    except ZeroDivisionError:   # 除数为0时执行
        print("除数不能为0!")
    except TypeError:           # 类型错误
        print("除法数据类型不符!")
    else:
        return ans

print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))

执行结果:

2.0
除数不能为0!
None
除法数据类型不符!
None
1.5

15.1.4 找不到文档的错误FileNotFoundError

程序设计时一个经常发生的异常是打开文档时找不到文档,这时会产生FileNotFoundError异常。

程序实例:

fn = 'data15_3.txt'   # 设置要打开的文件
try:
    with open(fn) as file_Obj:  # 以只读模式打开文件,返回file_Obj
        data = file_Obj.read    # 读取文件内容到data
except FileNotFoundError:
    print("找不到 %s 文档" % fn)
else:
    print(data)

执行结果:

找不到 data15_3.txt 文档

15.2 常见的异常对象

异常对象名称说明
AttributeError通常是指对象没有这个属性
Exception通用型异常,一般错误皆可使用
FileNotFoundError找不到open()打开的文档
IOError在输入或输出时发生错误
IndexError索引超出范围区间
KeyError在映射中没有这个键
MemoryError需求内存空间超出范围
NameError对象名称未声明
SyntaxError语法错误
SystemError直译器的系统错误
TypeError数据类型错误
ValueError输入无效参数
ZeroDivisionError除数为0

使用通用型异常对象exception可以捕捉各种异常。

程序实例:

def division(x, y):
    try:                   # try - except指令
        ans = x / y 
    except Exception:           # 通用型异常
        print("通用错误发生!")
    else:
        return ans

print(division(3, 2))
print(division(2, 0))
print(division('a', 'b'))
print(division(4, 3))

执行结果:

1.5
通用错误发生!
None
通用错误发生!
None
1.3333333333333333

15.3 finally

Python的关键词finally的功能是与try配合使用,在try之后可以有except或else,finally关键词必须放在except和else之后,不论是否有异常发生,都会执行finally中的程序代码

try:
    指令			# 预先设想可能引发异常的指令
except 异常对象:
    异常处理程序
finally:
    程序代码段	  # 必定执行

程序实例:

def division(x, y):
    try:                   # try - except指令
        return x / y 
    except Exception:           # 通用型异常
        print("异常发生!")
    finally:
        print("阶段任务完成")

print(division(3, 2), "\n")
print(division(2, 0), "\n")
print(division('a', 'b'), "\n")
print(division(4, 3), "\n")

执行结果:

阶段任务完成
1.5

异常发生!
阶段任务完成
None

异常发生!
阶段任务完成
None

阶段任务完成
1.3333333333333333


往期文章:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里逆天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值