# 异常

# 一、异常捕获-单个异常

'''
异常简介:
    概述:
        Python中把程序出现的所有非正常情况统称为异常, 异常也就是我们所说的Bug.
    程序遇到异常后会发生如下的两种情况:
        1. 如果我们没处理异常, 则程序遇到异常后, 会终止执行, 这个也是默认的处理方式.
        2. 如果我们处理了异常, 则程序会继续向下执行.
    格式:
        try:
            这里写可能会出现问题的代码
        except [异常类型 as 别名]:    # 这里的[]的意思是, 可选, 即: 可写可不写
            这里写的是出现问题后的解决方案
        else:
           如果代码没有出问题, 则执行这里的内容.
        finally:
            无论代码是否出问题, 最终都会走这里, 一般用于释放资源
'''

print('start')

# 入门格式
# try:
#     # print(10 / 0)
#     f = open('./2.txt', 'r', encoding='utf-8')
# except:
#     # f = open('./2.txt', 'w', encoding='utf-8')
#     print('出问题了, 文件不存在, 赶紧联系运维, 电话是: 111...')


try:
    # print(10 / 0)
    f = open('2.txt', 'r', encoding='utf-8')
except FileNotFoundError:
    # f = open('./2.txt', 'w', encoding='utf-8')
    print(f'出问题了 {FileNotFoundError}')

print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 二、异常捕获-多个异常

'''
异常捕获格式:
    try:
        这里写可能会出现问题的代码
    except [异常类型 as 别名]:    # 这里的[]的意思是, 可选, 即: 可写可不写
        这里写的是出现问题后的解决方案
    else:
       如果代码没有出问题, 则执行这里的内容.
    finally:
        无论代码是否出问题, 最终都会走这里, 一般用于释放资源
'''

# 版本1: 捕获多个异常
# print('start')
#
# try:
#     # print(10 / 0)
#     f = open('./2.txt', 'r', encoding='utf-8')
# except (FileNotFoundError, ZeroDivisionError):
#     # f = open('./2.txt', 'w', encoding='utf-8')
#     print(f'出问题了 ')   # 无法在这里提示具体的异常信息.
#
# print('end')


# 版本2: 给异常起别名.
# print('start')
#
# try:
#     print(10 / 0)
#     # f = open('./2.txt', 'r', encoding='utf-8')
# except (FileNotFoundError, ZeroDivisionError) as e:
#     # f = open('./2.txt', 'w', encoding='utf-8')
#     print(f'出问题了 {e}')
#
# print('end')


# 版本3: 实际开发中, 处理多个异常的写法如下, 因为Python中是有很多种异常的, 我们不可能每一个都考虑的非常周全, 所以一般写
# 所有异常的父对象, 即: Exception
print('start')

try:
    # print(10 / 0)
    f = open('2.txt', 'r', encoding='utf-8')
    # print('abc' + 10)
except Exception as e:
    # f = open('./2.txt', 'w', encoding='utf-8')
    print(f'出问题了 {e}')  # 实际开发中, 异常信息是要写入日志的, 如果异常过于严重, 则会触发 告警系统, 并通知相关人员.

print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 三、异常捕获-完整格式

'''
异常捕获格式:
    try:
        这里写可能会出现问题的代码
    except [异常类型 as 别名]:    # 这里的[]的意思是, 可选, 即: 可写可不写
        这里写的是出现问题后的解决方案
    else:
       如果代码没有出问题, 则执行这里的内容.
    finally:
        无论代码是否出问题, 最终都会走这里, 一般用于释放资源

执行流程:
    1. 先执行try里边的内容, 如果出现问题后, 无论try里边是否还有代码, 都不执行了, 直接跳到 except中.
    2. except中写的是出现问题后的解决方案, 这些解决方案, 可以根据你的项目进行自定义.
    3. 如果try里边内容没有出现异常, 则执行else里边的内容.
    4. 最后, 无论try里边是否出错, 都会执行finally里边的内容.

大白话解释:
    1. 先执行try, 看是否出问题.
    2. 出问题走 except, 不出问题走 else
    3. 无论是否出问题, 都走finally

快捷键:  ctrl + alt + T     代码补齐
'''

try:
    # 里边写的是可能出问题的代码
    print(10 / 2)
    print('看看我执行了吗? try')
except Exception as e:
    # 出问题后的解决方案
    print(f'出问题了, 问题原因: {e}')
else:
    print('try里边没有问题才会走这里, 我是 else')
finally:
    print('无论try是否有问题, 都会走这里, 这里是finally')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# 四、异常捕获-读取文件数据

'''
需求: 读取当前项目下的1.txt文件的信息, 如果文件不存在, 不要报错, 提示即可, 程序继续执行.
'''


try:
    # 可能出问题的代码
    # 1. 获取文件对象.
    f = open('1.txt', 'r', encoding='utf-8')
except Exception as e:
    print(f'出问题了, 问题原因是: {e}')
else:
    # 没有出问题, 就走这里.
    # 2. 读取文件内容.
    data = f.read()
    # 3. 打印读取到的内容
    print(data)
    # 4. 释放资源
    f.close()
finally:
    # 无论是否出问题, 都会走这, 一般用于释放资源.
    print('程序结束了')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

五、异常的传递性

'''
异常的传递性解释:
    概述:
        所谓的异常的传递性指的是 函数会将它的异常传给它的调用者, 让它的调用者来处理.
        而我们知道最终所有的函数都是在 main函数中执行的, 所以就意味着所有的异常都会
        传到main函数中,即: 我们只要在main函数中处理了异常, 则所有异常我们就也都处理了.
    例如:
        main函数 调用 fun2函数,  fun2函数 调用 fun1函数,  而 fun1函数有一个异常(没有处理),
        则 fun1函数会把异常传给 fun2, 然后fun2会把异常传给main
'''

# 定义fun1函数
def fun1():
    print('----- fun1 start -----3')
    print(10 // 0)     # 这里有异常了
    print('----- fun1 end -------5')

# 定义fun2函数, 在其内部调用fun1函数
def fun2():
    print('----- fun2 start -----2')
    # 在这里调用fun1函数
    fun1()
    print('----- fun2 end -------6')


# 可以理解为这个就是 main函数的内容.
print('----- main start -----1')
try:
    # 调用fun2函数
    fun2()
except:
    print('出问题了')
print('----- main end -------7')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
更新时间: 2/4/2024, 10:22:42 PM