python-基础篇-异常

导图

请添加图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

理论

异常机制本质

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。
所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。
python 中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中 包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了 python 中内建异常类的继承层次:
在这里插入图片描述

python 中一切都是对象,异常也采用对象的方式来处理。处理过程:

  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
  2. 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。

语法

try…一个 except 结构

try…except 是最常见的异常处理结构。
结构如下:
在这里插入图片描述
try 块包含着可能引发异常的代码,except 块则用来捕捉和处理发生的异常。执行的时 候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;执行的时候,如果 try块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。
在这里插入图片描述
如上的执行结果是:
step1
step3
division by zero
step4

我们可以看到,程序执行到引发异常的语句时,直接掉到 except 异常处理语句块进行 处理;处理完毕后,继续执行下面的程序。
在这里插入图片描述
如上代码的执行结果是:
step1
step2
step4

try 语句块没有发生异常,则正常执行完 try 块后跳过 except 异常处理语句块,继续往 下执行。


【示例】循环输入数字,如果不是数字则处理异常;直到输入 88,则结束循环。
在这里插入图片描述


【示例】简单的异常捕获

try:
    # 不能确定正确执行的代码
    num = int(input("请输入一个整数:"))
except:
    # 错误的处理代码
    print("请输入正确的整数")

print("-" * 50)

在这里插入图片描述

try…多个 except 结构

上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议 尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代 码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException。

结构如下:
在这里插入图片描述


【示例】多个 except 结构
在这里插入图片描述


【示例】捕获错误类型

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ZeroDivisionError:
    print("除0错误")
except ValueError:
    print("请输入正确的整数")

在这里插入图片描述


【示例】捕获未知错误

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

在这里插入图片描述


try…except…else 结构

try…except…else 结构增加了“else 块”。如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。


【示例】try…except…else 结构执行测试
在这里插入图片描述
发生异常的执行情况(执行 except 块,没有执行 else):
请输入被除数:5
请输入除数:0
float division by zero

没有发生异常的执行情况(执行完 try 块后,执行 else):
请输入被除数:10
请输入除数:5
除的结果是: 2.0

try…except…finally 结构

try…except…finally 结构中,finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。

【示例】try…except…finally 结构简单测试
在这里插入图片描述


【示例】读取文件,finally 中保证关闭文件资源
在这里插入图片描述
在这里插入图片描述


【示例】完整的异常语法

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功")
finally:
    print("无论是否出现错误都会执行的代码")

print("-" * 50)

在这里插入图片描述

return 语句和异常处理问题

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。

【示例】return 和异常结构的正确处理方式
在这里插入图片描述
执行结果:
step1
step2
异常:0 不能做除数
step4
step5
e


【示例】异常的传递

def demo1():
    return int(input("输入整数:"))


def demo2():
    return demo1()

# 利用异常的传递性,在主程序捕获异常
try:
    print(demo2())
except Exception as result:
    print("未知错误 %s" % result)

在这里插入图片描述


【示例】抛出异常

def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 如果 < 8 主动抛出异常
    print("主动抛出异常")
    # 1> 创建异常对象 - 可以使用错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2> 主动抛出异常
    raise ex


# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    print(result)

在这里插入图片描述

with 上下文管理

finally 块由于是否发生异常都会执行,通常我们放释放资源的代码。其实,我们可以通 过 with 上下文管理,更方便的实现释放资源的操作。

with 上下文管理的语法结构如下:
在这里插入图片描述
with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的 现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。
在这里插入图片描述

trackback 模块

【示例】使用 Traceback 模块打印异常信息
在这里插入图片描述


【示例】使用 traceback 将异常信息写入日志文件

在这里插入图片描述

自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常 继承 Exception 或其子类即可。命名一般以 Error、Exception 为后缀。

自定义异常由 raise 语句主动抛出。

【示例】自定义异常类和 raise 语句
在这里插入图片描述
在这里插入图片描述

汇总

值得汇总的

常见异常的解决

Python 中的异常都派生自 BaseException 类,本节我们测试和列出常见的一些异常,方 便初学者掌握。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常见异常汇总

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关推荐

  1. Python基础学习笔记——异常

    2024-02-01 13:24:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-01 13:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-01 13:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-01 13:24:02       82 阅读
  4. Python语言-面向对象

    2024-02-01 13:24:02       91 阅读

热门阅读

  1. UCL-ELEC0136: Data Acquisition and Processing Systems

    2024-02-01 13:24:02       49 阅读
  2. 单例模式

    2024-02-01 13:24:02       56 阅读
  3. 植保无人机如何提高作业效率?

    2024-02-01 13:24:02       56 阅读
  4. openssl3.2 - 帮助文档的整理

    2024-02-01 13:24:02       59 阅读
  5. 影响PCBA制造成本的因素有哪些?

    2024-02-01 13:24:02       60 阅读
  6. 【Spring框架】@Cacheable注解:缓存最佳实践

    2024-02-01 13:24:02       52 阅读