十八、异常
18.1、异常介绍
程序在运行时,遇到错误,程序停止
提示信息这个动作叫 抛出异常(raise关键字)
捕获异常:程序遇到异常,默认动作是中止执行,遇见异常后,可以使用异常捕获,让代码继续执行,不会中止(重点)
18.2、异常捕获(重点)
基本语法
try:
书写可能发生异常的代码
except: # 任何类型的异常代码都能捕获
发生了异常执行的代码
try:
书写可能发生异常的代码
except 异常类型: # 只能捕获指定类型的异常,如果不是这个异常,还是会报错
发生了异常执行的代码
# try:
# num=input('请输入数字')
# num = int(num)
# print(num)
# except:
# print("请输入正确的数字")
try:
num=input('请输入数字')
num = int(num)
print(num)
# a=10/num # 10/0
# print(f'a:{a}')
except ValueError: # 只能捕获ValueError 类型及其子类的异常
print("发生了异常,请输入正确的数字")
捕获指定类型的异常
好处:可以针对不同异常错误,进行单独代码处理
try:
书写可能发生异常的代码
except 异常类型1: # 只能捕获指定类型的异常,如果不是这个异常,还是会报错
发生了异常1执行的代码
except 异常类型2:
发生了异常1执行的代码
except 异常类型...:
发生了异常...执行的代码
try:
num=input('请输入数字')
num = int(num)
print(num)
a=10/num # 10/0
print(f'a:{a}')
except ValueError: # 只能捕获ValueError 类型及其子类的异常
print("发生了异常,请输入正确的数字")
except ZeroDivisionError:
print('除数不能为0')
异常捕获的完整版本
完整版本中的内容,不是说每一崔都要全部书写,根据自己的需要,去选择其中的进行使用
try:
可能发生异常的代码
except 异常类型1:
发生异常类型1 执行的代码
# Exception 是常见异常类的父类,这里书写Exception,可以捕获常见的所有异常,as变量,这个变量是一个异常类的对象,print(变量)可以打印异常信息
except Exception as 变量:
发生其他类型的异常,执行的代码
else:
没有发生异常会执行的代码
finally:
不管有没有发生异常,都会执行的代码
try:
可能发生异常的代码
except Exception as 变量:
发生异常执行的代码
try:
num = input('请输入数字')
num = int(num)
print(num)
a = 10 / num # 10/0
print(f'a:{a}')
except Exception as e:
print(f'错误信息为:{e}')
else:
print('没有发生异常我会执行')
finally:
print('不顾有没有发生异常,我都会执行')
18.3、异常的传递(了解)
异常传递是python中已经实现好的,
异常传递:在函数嵌套调用的过程,被调用的函数,发生了异常,如果没有捕获。会将这个异常向外层传递,...如果传到外层还没捕获,才报错
def func1():
num = 10 / 0
print(num)
def func2():
print('1111')
func1()
func2()
try:
func2()
except Exception as e:
print(e)
十九、模块和包
1.python 源代码文件就是一个 模块
2.模块中定义的变量 函数 类,都可以让别人使用,同样,可以使用别人定义的(好处:可以直接使用)
3.想要使用别人模块中的内容工具(变量,类,函数),必须先导入模块,才可以
4.自己写的代码,作为模块使用,代码的名字需要满足标识符的规则(由数字,字母下划线组成,不能以数字开头)
19.1、导入模块的语法
方式一:
import 模块名
# 使用模块中的内容
模块名.工具名
举例:
import random
import json
random.randint(a,b)
json.load()
json.dump()
方式二:
from 模块名 import 工具名
# 使用
工具名 # 如果是函数和类需要加括号
# 举例
from random import randint
from json import load,dump
randint(a,b)
load()
dump()
方式三(了解)
from 模块名 import * # 将模块中所有内容都导入
举例:
from random import *
from json import *
random
json
快捷导包:
# 方式一:
import random
print(random.randint(1, 20))
# 方式二,快捷方式导包
from random import randint
print(randint(1, 20))
# 方式三 可能存在多个模块中有相同的名字工具,会产生冲突
from random import *
print(randint(1,20))
对于导入的模块和工具可以使用as关键字给其起别名
注意:如果起别名,原来的名字就不能用了,只能使用别名
19.2、模块的查找顺序
在导入模块的时候,会在当前目录中找代码,如果找到,就直接使用。
如果没有找到会去系统目录进行查找,找到直接使用,没有找到报错
注意:
定义代码文件时,代码名字和导入的模块名字 不能 相同
19.3、__ name __ 的作用
1.每个代码文件都是一个模块
2.在导入模块的时候,会执行模块中的代码(三种方法)
3.__name__变量
3.1 __name__变量,python解释器会自动维护
3.2 __name__变量,如果直接运行,值是"__main__"
3.3 __name__变量,如果代码是被导入执行,值是 模块名(即代码文件名)
tools:
# 定义一个函数add() 对两个数字进行求和计算
def add(a, b):
return a + b
# 调用函数
print('在代码中调用函数')
print(add(1, 2))
print(add(10, 20))
print('tools', __name__)
输出:
在代码中调用函数
3
30
tools: __main__
导入tools:
# 需求 调用tools模块中add函数,进行求和计算
import tools # 导入模块,执行tools模块中的代码
print(tools.add(100,200))
输出:
在代码中调用函数
3
30
tools: tools
300
若导入时不想执行模块中的代码,则用到__ name__
tools模块:
# 定义一个函数add() 对两个数字进行求和计算
def add(a, b):
return a + b
if __name__ == '__main__':
# 调用函数
print('在代码中调用函数')
print(add(1, 2))
print(add(10, 20))
print('tools:', __name__)
导入tools模块:
# 需求 调用tools模块中add函数,进行求和计算
import tools # 导入模块,执行tools模块中的代码
print(tools.add(100,200))
输出:300
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEIhomWi-1652009382665)(C:\Users\LIUBO\AppData\Roaming\Typora\typora-user-images\1651909558691.png)]
练习
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pYppBC7-1652009382665)(C:\Users\LIUBO\AppData\Roaming\Typora\typora-user-images\1651977700619.png)]
注意:
19.4、包(package)
在python中,包是一个目录,只不过在这个目录存在一个文件__init__.py
将功能相近或相似的代码放在一起的。
在python中使用的时候,不需要区分是 包还是模块 使用方式相同
random 模块(单个代码文件)
json 包(目录)
1.import 包名
2.alt+回车 快捷导入