[Python公开课]零基础玩转Python进阶篇----第九节:Python的异常分析及解决

简介: [Python公开课]零基础玩转Python进阶篇----第九节:Python的异常分析及解决

网络异常,图片无法展示
|

📢📢📢📣📣📣 🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜 🏅🏅🏅CSDN Python领域优质创作者,大二在读,欢迎大家找我合作学习(文末有VX 想进学习交流群or学习资料 欢迎+++) 💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀 💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺 🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈 🌟🌟🌟✨✨✨

前言: 📢📢📢【Python公开课】系列课程是针对Python入门&进阶打造的一全套课程,如果你喜欢的话就抓紧收藏订阅起来吧~💘💘💘 【报团取暖】🆘🆘🆘 🍋🍋🍋如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者在文末添加我的VX,我会拉你进学习交流群,我们一起交流学习,报团打卡

@TOC

1️⃣ 学习目标----提前知💞💞💞

☀️☀️☀️一个崇高的目标,只要不渝地追求,就会成为壮举!

  • 理解异常的概念
  • 掌握处理异常的几种方式
  • 掌握raise和assert语句,会抛出自定义的异常
  • 掌握with和as环境安装器的使用

2️⃣ 学习任务----我能行🍻🍻🍻

🏅🏅🏅穷且益坚,不坠青云之志!

🚩01 异常简介

异常介绍

在Python中,程序在执行的过程中产生的错误称为异常,比如列表索引越界、打开不存在的文件等。 这两行代码会报错吗?

print(a)
open("123.txt","r")

报错信息:

NameError: name 'a' is not defined
FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
  • 第1个异常的类型为NameError(名称),描述信息为a没有定义;
  • 第2个异常为FileNotFoundError,描述信息为没有找到123.txt文件

🚩02 异常类

所有异常都是基类Exception的成员,它们都定义在exceptions模块中。 如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行,这些信息包括错误的名称(例如NameError)、原因和错误发生的行号。

1. NameError

尝试访问一个未声明的变量,会引发NameError。

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 1, in <module>
    print(foo)
NameError: name 'foo' is not defined

2. ZeroDivisionError

当除数为零的时候,会引发ZeroDivisionError异常。

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 1, in <module>
    1/0
ZeroDivisionError: division by zero

3. SyntaxError

当解释器发现语法错误时,会引发SyntaxError异常

File "D:/PythonCode/Chapter09/异常.py", line 2
    for i in list
                ^
SyntaxError: invalid syntax

4. IndexError

当使用序列中不存在的索引时,会引发IndexError异常

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 2, in <module>
    list[0]
IndexError: list index out of range

5. KeyError

当使用映射中不存在的键时,会引发KeyError异常。

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 2, in <module>
    myDict['server']
KeyError: 'server’

6. FileNotFoundError

试图打开不存在的文件时,会引发FileNotFoundError

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 1, in <module>
    f = open("test")
FileNotFoundError: [Errno 2] No such file or directory: 'test’

7. AttributeError

当尝试访问未知对象属性时,会引发AttributeError异常

Traceback (most recent call last):
  File "D:/PythonCode/Chapter09/异常.py", line 6, in <module>
    print(car.name)
AttributeError: 'Car' object has no attribute 'name’

🚩03 异常处理

捕获简单异常

try-except语句定义了监控异常的一段代码,并提供了处理异常的机制。

try:
      # 语句块
except:
      # 异常处理代码

网络异常,图片无法展示
|

捕获多个异常

处理多个异常的try-except语句格式如下:

try:
   # 语句块
except 异常名称1:
    # 异常处理代码1
except异常名称2:
    # 异常处理代码

网络异常,图片无法展示
|

捕获异常的描述信息

当出现多种异常时,为了区分不同的错误信息,可以使用as获取系统反馈的信息。

# 获取描述信息
except (ZeroDivisionError, ValueError) as result:
    print("捕捉到异常:%s"%result)

捕获所有的异常

当程序中出现大量异常时,捕获这些异常是非常麻烦的。这时,我们可以在except子句中不指明异常的类型,这样,不管发生何种类型的异常,都会执行except里面的处理代码。

没有捕获到异常(else)

如果try语句没有捕获到任何的错误信息,就不再执行任何except语句,而是会执行else语句

网络异常,图片无法展示
|

终止行为(finally)

在程序中,无论是否捕捉到异常,都必须要执行某件事情,例如关闭文件、释放锁等,这时可以提供finally语句处理。通常情况下,finally用于释放资源。

🚩 04 抛出异常

1.raise语句

使用raise语句能显示地触发异常,格式如下:

  1. raise 异常类名(引发指定异常类的实例)
  2. raise 异常类对象(引发指定异常类的实例)
  3. raise (重新引发刚刚发生的异常)

1. 使用类名引发异常

当raise语句指定异常的类名时,会创建该类的实例对象,然后引发异常。 raise IndexError:

Traceback (most recent call last):
  File "D:/异常.py", line 1, in <module>
    raise IndexError
IndexError

2. 使用异常类的实例引发异常

index = IndexError() raise index

Traceback (most recent call last):
  File "D:/异常.py", line 2, in <module>
    raise index
IndexError

3. 传递异常

不带任何参数的raise语句,可以再次引发刚刚发生过的异常,作用就是向外传递异常。

try:
    raise IndexError
except:
    print("出错了")
    raise
出错了
  File "D:/异常.py", line 2, in <module>
    raise IndexError
IndexError

4. 指定异常的描述信息

raise IndexError("索引下标超出范围")

Traceback (most recent call last):
  File "D:/异常.py", line 1, in <module>
    raise IndexError("索引下标超出范围")
IndexError: 索引下标超出范围

5. 异常引发异常

使用raise...from…可以在异常中抛出另外的异常。

try:
   num
except Exception as exception:
   raise IndexError("下标超出范围") from exception

try里面只定义了变量num,会引发NameError异常。except子句使用raise...from… 抛出NameError异常后再抛出“下标越界”的异常。

2.assert语句

assert语句又称作断言,指的是期望用户满足指定的条件。 当用户定义的约束条件不满足的时候,它会触发AssertionError异常,所以assert语句可以当做条件式的raise语句assert语句格式如下: assert 逻辑表达式,data →if not 逻辑表达式: raise AssertionError(data) assert后面紧跟一个逻辑表达式,相当于条件。Data通常是一个字符串,当条件为false时作为异常的描述信息。

🚩05 自定义异常

创建一个继承 Exception类的子类,就是自定义异常类。 当遇到自己设定的错误时,使用raise语句抛出自定义的异常

🚩06 with和as环境安装器

with语句

现在有一个需求,打开foo.txt文本文件,读取完所有的数据以后关闭文件。 示例代码如下:

file = open(“/tmp/foo.txt”)   # 打开文件
data = file.read()                   # 读取数据
file.close()                            # 关闭文件

文件读取出现问题怎么办?忘记关闭文件出现问题怎么办?

网络异常,图片无法展示
|
为了避免在文件读取的过程中产生这些问题,可以在上述示例中增加处理异常的语句, 加强版本如下:

file = open("/tmp/foo.txt")   
try: 
    data = file.read()
finally:  
    file.close()

该代码虽然解决了产生异常的可能,但是这段代码过于冗长。此时,在示例中使用with语句处理上下文环境产生的异常,具体如下:

with open("/tmp/foo.txt") as file:
    data = file.read()

Python 2.5开始,引入了with语句,with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。 with语句格式:

with context_expr [as var]:
    with_body

with语句执行过程: (1)执行context_expr,生成上下文管理context_manager; (2)调用上下文管理器的__enter__()方法,如果使用了as子句,就把__enter__() 方法的返回值赋值给 as 子句中的var; (3)执行语句体with_body。 (4)无论在执行的过程中是否发生异常,都会执行上下文管理器的 exit() 方法。该方法负责执行程序的“清理”工作,如释放资源等。 (5)如果执行过程中没有出现异常,或者语句体中执行了break、continue或者return语句,则以None 作为参数调用__exit__()方法;如果执行过程中出现异常,则会使用sys.exc_info 得到的异常信息为参数调用__exit__()方法。 (6)出现异常时,如果__exit__()方法返回的结果为False,则会重新抛出异常,让with 之外的语句逻辑来处理异常,这是通用做法;如果返回True,则忽略异常,不再对异常进行处理。

上下文管理器

要想使用with语句进行工作,前提是要有上下文管理器。 上下文管理器是Python 2.5开始支持的一种语法,用于规定某个对象的使用范围,一旦进入或者离开使用范围,会有特殊的操作被调用。

1. 上下文管理协议

__enter__(self):进入上下文管理器时调用此方法,其返回值被放入with-as语句中as说明符指定的变量中。 _exit__(self, type, value, tb):离开上下文管理器调用此方法。如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息;如果没有异常,3个参数均设为None。此方法返回值为True或者False,分别指示被引发的异常得到了还是没有得到处理,如果返回False,引发的异常会被传递出上下文。

2. 上下文管理器

支持上下文管理协议的对象,用于实现__enter__()和__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常情况下,使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

3. 运行时上下文

由上下文管理器创建,通过上下文管理器的__enter__()和__exit__()方法实现。其中,enter() 方法在语句体执行之前进入运行时上下文,exit() 在语句体执行完后从运行时上下文退出。

3️⃣ 本章小结----知难易🏆🏆🏆

😊😊😊人生是跋涉,也是旅行;是等待,也是重逢;是探险,也是寻宝;是眼泪,也是歌声!

本章围绕着Python的异常进行介绍,包括异常类、抛出和捕捉系统内置的异常、抛出和捕捉自定义异常,以及with和as环境安装器。通过对本章的学习,大家应该深入了解了异常产生的原理,并知道如何在程序中运行它们。

4️⃣ 小试牛刀----习题讲解🌈🌈🌈

🏃 🏃 🏃本期问题

✍第一题

13. 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。代码:

for n in range(100,1000):
    i = n // 100
    j = n // 10 % 10
    k = n % 10
    if n == i**3 + j**3 + k**3:
        print(n)

思路: 利用for循环控制100-999个数,每个数分解出个位,十位,百位。这个没啥好说的,记住整除取余的一系列操作就行了!

✍第二题

14.将一个正整数分解质因数。例如:输入90,打印出90=233*5。代码:

a = int(input('请输入你要分解的正整数:'))
for i in range(2,a):
    while a!=1:
        if a%i==0:
            for j in range(2,i):
                if i%j==0:
                    break
            else:
                a = a/i
                if a== 1:
                    print('%d'%i,end='')
                else:
                    print('%d*'%i,end='')
        else:
            break

思路: 看到这道题我看到的时候第一想法:结合素数求法进行求解,双循环结构,但后来仔细一想,能被目标数从0开始遍历,前面的数如果能被整除的话不会轮到后面,所以说根本就不用判断是不是素数,直接从2开始,看看谁可以被目标数整除,该数肯定是素数。 然后通过格式化字符串进行输出!简化一下代码:

num = int(input('请输入:'))
for i in range(2, num):
    while num!=1:
        if num % i == 0:
            num = num / i
            if num==1:
                print('%d'%i,end='')
            else:
                print('%d*'%i,end='')
        else:
            break
目录
相关文章
|
22天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
46 4
|
7天前
|
存储 索引 Python
|
8天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
19天前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
48 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
4天前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
6天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
20 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
9天前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】
|
15天前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
35 2
|
19天前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
17 1
|
25天前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
66 2