《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))

执行结果:
《Python零基础快乐学习之旅》学习笔记15——程序调试与异常处理_第1张图片

由于最后一行输出中,传入的第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))

执行结果:
《Python零基础快乐学习之旅》学习笔记15——程序调试与异常处理_第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


往期文章:

  • 《Python零基础快乐学习之旅》学习笔记2——认识变量与基本数学运算
  • 《Python零基础快乐学习之旅》学习笔记3——Python的基本数据类型
  • 《Python零基础快乐学习之旅》学习笔记4——基本输入与输出
  • 《Python零基础快乐学习之旅》学习笔记5——程序的流程控制使用if语句
  • 《Python零基础快乐学习之旅》学习笔记6——列表(list)
  • 《Python零基础快乐学习之旅》学习笔记7——循环设计
  • 《Python零基础快乐学习之旅》学习笔记8——元组(tuple)
  • 《Python零基础快乐学习之旅》学习笔记9——字典(dict)
  • 《Python零基础快乐学习之旅》学习笔记10——集合(set)
  • 《Python零基础快乐学习之旅》学习笔记11——函数设计
  • 《Python零基础快乐学习之旅》学习笔记12——类-面向对象
  • 《Python零基础快乐学习之旅》学习笔记13——模块的设计与应用
  • 《Python零基础快乐学习之旅》学习笔记14——文档的读取与写入

你可能感兴趣的:(学习笔记,Python,python,异常处理)