# 异常

# 异常介绍

# 定义

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

# 异常演示

image-20230422202359379

# 异常的捕获方法

# 捕获异常原因

  1. 世界上没有完美的程序,任何程序在运行的过程中,都有可能出现:异常,也就是出现 bug 导致程序无法完美运行下去
  2. 我们要做的,不是力求程序完美运行。而是在力所能及的范围内,对可能出现的 bug,进行提前准备、提前处理
  3. 这种行为我们称之为:异常处理(捕获异常)
  4. 捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段

# 捕获常规异常

# 基本语法

try:
    可能发生的错误
except:
    如果发生异常执行的代码

# 捕获指定异常

# 基本语法

try:
    print(name)
except NameError as e:
    print("name变量名未定义错误")

# 注意

  1. 如果异常执行的代码的异常类型和要捕获的异常类型不一样,则无法捕获异常
  2. 一般 try 下方只能放一行尝试执行的代码

# 捕获多个异常

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

try:
    print(1 / 0)
except (NameError, ZeroDivisionError):
    print("出现以上两种错误之一")

# 捕获异常并输出描述信息

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

# 捕获所有异常

try:
    print(1 / 0)
except Exception as e:
    print(e)

# 异常 else

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

try:
    print(1)
except Exception as e:
    print(e)
else:
    print("无异常")

# 异常 finally

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

try:
    f = open("test.txt", "r")
except Excception as e:
    f = open("test.txt", "w")
else:
    print("没有异常")
finally:
    f.close()

# 异常的传递

# 介绍

异常是有传递性的

# 代码

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

def func01():
    num = 1 / 0
def func02():
    func01()
def main():
    try:
        func02()
    except Exception as e:
        print(e)
main()

# Python 模块

# 模块导入

# 模块介绍

Python 模块 (Module),是一个 Python 文件,以 .py 结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码

# 模块作用

python 中有很多各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用 time 模块我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能

# 模块导入方式

[from 模块名] import [模块 || 变量 | 函数 | *] [as 别名]
  1. import 模块名
  2. from 模块名 import 类、变量、方法
  3. from 模块名 import *
  4. import 模块名 as 别名
  5. from 模块名 import 功能名 as 别名

# import 模块名

import time
time.sleep(5)

# from 模块名 import 功能名

from time import sleep
sleep(5)

# from 模块名 import *

from time import *
sleep(5)

# 自定义模块

# 制作自定义模块

  1. Python 中已经帮我们实现了很多的模块。不过有时候我们需要一些个性化的模块,这里就可以通过自定义模块实现,也就是自己制作一个模块
  2. 每个 Python 文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则
  3. 当导入多个模块的时候,且模块内有同名功能。当调用这个同名功能的时候,调用到的是后面导入的模块的功能
  4. 如果一个模块文件中有 __all__ 变量,当使用 from xxx import * 导入时,只能导入这个列表中的元素

# 测试模块

# 问题

无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行 test 函数的调用

# 解决方案

def test(a, b):
    print(a + b)
if __name__ == '__main__':
    test(1, 2)

# Python 包

# 自定义包

# Python 包介绍

  1. 从物理上看,包就是一个文件夹,在该文件夹下包含了一个 init.py 文件,该文件夹可用于包含多个模块文件
  2. 从逻辑上看,包的本质依然是模块
  3. 当我们的模块文件越来越多时,包可以帮助我们管理这些模块,包的作用就是包含多个模块,但包的本质依然是模块

# 创建包过程

  1. [New]
  2. [Python Package]
  3. 输入包名
  4. [OK]
  5. 新建功能模块

# 导入包

# 方式 1

import 包名.模块名
包名.模块名.目标函数

# 方式 2

from 包名 import *

注意:必须在 __init__.py 文件中添加 __all__ = [] ,控制允许导入的模块列表

# 安装第三方包

# 第三方包介绍

在 Python 程序的生态中,有许多非常多的第三方包(非 Python 官方),可以极大的帮助我们提高开发效率

# 安装第三方包 - pip

pip install 包名称

# pip 网络优化

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装第三方包 - PyCharm

image-20230422210109649