了解异常

什么是异常

当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG

bug单词的诞生

早期计算机采用大量继电器工作,马克二型计算机就是这样的。

1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试了很多办法,最后定位到第70号继电器出错。负责人哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。”自此之后,引发软件失效的缺陷,便被称为Bug。

 

异常演示 

例如:以`r`方式打开一个不存在的文件。 

f = open('linux.txt', 'r')

执行结果: 

 常见的异常

示例:

# NameError、IndexError、KeyError、TypeError
print(12 + '12')  # TypeError: unsupported operand type(s) for +: 'int' and 'str'
print('12' + 12)  # TypeError: can only concatenate str (not "int") to str

dict1 = {
    "key1": 123,
    "key2": 321
}

print(dict1["key3"])    # KeyError: 'key3'

print(a)  # NameError: name 'a' is not defined

总结

1. 什么是异常:

异常就是程序运行的过程中出现了错误

2. bug是什么意思:

bug就是指异常的意思,因为历史因为小虫子导致计算机失灵的案例,所以延续至今,bug就代表软件出现错误。 

  • 异常指是Python程序发生的不正常事件,异常可称为错误

  • 当检测到一个错误时,Python解释器就无法正常继续工作,会出现一些错误提示信息,这些信息就叫做异常信息,这就是我们常说的bug。

  • 通常情况下Python中的异常的名称是以Error结尾

异常的捕获方法

为什么要捕获异常

世界上没有完美的程序,任何程序在运行的过程中,都有可能出现:异常,也就是出现bug 导致程序无法完美运行下去。

我们要做的,不是力求程序完美运行。

而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。

这种行为我们称之为:异常处理(捕获异常)

为什么需要捕获异常

当我们的程序遇到了BUG, 那么接下来有两种情况:      

         ① 整个程序因为一个BUG停止运行      

         ② 对BUG进行提醒, 整个程序继续运行

显然在之前的学习中, 我们所有的程序遇到BUG就会出现①的这种情况, 也就是整个程序直接奔溃. 但是在真实工作中, 我们肯定不能因为一个小的BUG就让整个程序全部奔溃, 也就是我们希望的是达到② 的这种情况 那这里我们就需要使用到捕获异常

捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。

捕获常规异常

基本语法:

快速入门

需求:尝试以`r`模式打开文件,如果文件不存在,则以`w`方式打开。 

捕获指定异常

基本语法:

注意事项

① 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。

② 一般try下方只放一行尝试执行的代码。

示例:

# 创建一个列表
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 制造一个IndexError

try:
    print(list1[10])

except IndexError:
    print("发生了异常")

print("Holle World")

捕获多个异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组的方式进行书写。

执行结果:

示例:

# 创建一个列表
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 创建一个列表
dict1 = {}
# 建议在try中只写一行代码

try:
    print(list1[9])  # IndexError
    print(dict1['key1'])  # KeyError
except (IndexError, KeyError) as e:
    # e此时就是异常信息
    print(f"发生了{e}的异常")

 总结:

当捕获多个异常时,可以将多个异常使用元组形式存入

捕获异常并输出描述信息

基本语法:

try:
    print(1/0)
except (NameError,ZeroDivisionError) as e:
    print(e)

 执行结果:

捕获所有异常

基本语法:

执行结果:

示例:

# 创建一个列表
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 创建一个字典
dict1 = {}
# 建议在try中只写一行代码
try:
    # print(data[3] / 0)  # IndexError
    print(dict1['key1'])  # KeyError
except Exception as e:
    # e此时就是异常信息
    print(f"发生了{e}的异常")

 总结

  • 在捕获异常的三种方式中,捕获所有异常方式是最简洁高效

  • 在实际开发中,推荐使用捕获所有异常来处理所有有可能发生异常的代码

异常else

else表示的是如果没有异常要执行的代码。

 执行结果:

异常的finally

finally表示的是无论是否异常都要执行的代码,例如关闭文件。

示例:

# 创建一个列表
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 创建一个字典
dict1 = {}
try:
    print(data[5])
except IndexError as e:
    print(f"发生了异常:{e}")
else:
    print("程序正常运行")
finally:
    print("无论有没有异常都会执行")

总结

1. 为什么要捕获异常?

        在可能发生异常的地方,进行捕获。当异常出现的时候,提供解决方式,而不是任由其导致程序无法运行。

2. 捕获异常的语法?

3. 如何捕获所有异常?

异常的种类多种多样,如果想要不管什么类型的异常都能捕获到,那么使用:

        except:

        except Exception:

        两种方式捕获全部的异常

  • 关键字else:表示当程序不发生异常时要执行的代码

  • 关键字finally:表示程序无论发不发生异常时都会执行的代码,可以用于一些必须要完成的操作,比如关闭文件、关闭系统资源等操作

异常的传递

异常的传递

异常是具有传递性的

函数func01中发生异常, 并且没有捕获处理这个异常的时候, 异常 会传递到函数func02, 当func02也没有捕获处理这个异常的时候 main函数会捕获这个异常,  这就是异常的传递性.

提示:    

        当所有函数都没有捕获异常的时候, 程序就会报错

利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候, 就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都 会传递到main函数中, 这样就可以确保所有的异常都会被捕获 

示例:

# 定义一个列表
list1 = [1, 2, 3, 4, 5]

# 定义函数func1
def func1():
    print("这是func1开始---------------")
    # try:
    #     print(list1[3] + '4')
    # except TypeError as e:
    #     print(f"在func1中发生了异常,异常信息为:{e}")
    print(list1[3] + '4')
    print("这是func1结束---------------")

# 定义函数func2
def func2():
    print("这是func2开始---------------")
    func1()
    print("这是func2结束---------------")

if __name__ == '__main__':
    try:
        func2()
    except Exception as e:
        print(f"在main函数中发生了异常,异常信息为:{e}")

总结:

  • 当一段代码可能会发生异常时,我们需要进行异常的捕获,当代码之间有嵌套时,异常会从里向外传递

  • 如果我们在最外层代码进行异常捕获,可以捕获到所有的代码异常,一般用Exception

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐