文章目录
异常
- 程序的错误有两种
- 编码出错,不符合语言的语法
- 运行时报错-------异常
- 程序运行期间要避免异常
- 程序一旦出现异常就终止运行
捕获异常
- 语法:
try:
可能出现异常的语句
except:
出现异常后会自动执行的语句
如果try下面的代码没有出现异常,就不会执行except下面的代码语句
只有try下面的代码出现异常,except下面的代码才会执行
一旦异常被try捕捉,程序就不会报错终止
try:
a = int(input("请输入一个整数"))
except:
print("输入不正确")
捕捉不同类型异常
- 语法:
try:
可能出现异常的代码
except 异常类型1:
出现异常类型1执行的代码
except 异常类型2:
出现异常类型2执行的代码
except:
出现未知异常类型执行的代码
try:
a = int(input("请输入一个整数:"))
b = int(input("请输入一个整数:"))
print(a / b)
except ValueError:
print("请输入一个可以转化为整数的数")
except ZeroDivisionError:
print("除数不能为0")
except:
print("未知错误")
# ValueError:输入的值不能转化为整数
# ZeroDivisionError:除数为0的时候报的错误
没有异常发生执行的代码
- 语法:
try:
可能出现异常的代码
except:
出现异常执行的代码
else:
没有发生异常执行的代码
try:
a = int(input("请输入a的值;"))
b = int(input("请输入b的值;"))
print(a / b)
except:
print("异常发生")
else:
print("没有异常发生")
捕捉未知异常显示系统异常信息
try:
a = int(input("请输入a的值:"))
b = int(input("请输入b的值:"))
print(a / b)
except Exception as result: # 捕捉未知异常,把未知异常系统的错误提示显示出来
print(result)
无论是否异常都要执行的代码
try:
可能出现异常的代码
except:
出现异常执行的代码
finally:
无论是否异常都要执行的代码
try:
a = int(input("请输入a的值;"))
b = int(input("请输入b的值;"))
print(a / b)
except:
print("异常发生")
finally:
print("无论是否有异常都要执行")
异常捕获完整语法
try:
可能出现异常的代码
except 指定异常类型1:
异常执行的代码
except 指定异常类型2:
异常执行的代码
except Exception as result:
异常执行代码
else:
没有异常执行的代码
finally:
无论是否有异常都执行的代码
try:
a = int(input("请输入a的值:"))
b = int(input("请输入b的值:"))
print(a / b)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除数不能为0")
except Exception as result:
print("未知异常",result)
else:
print("代码没有异常发生")
finally:
print("代码执行完成")
主动抛出异常(raise)
- 可以通过人为的抛出异常
- 语法:
raise Exception(“异常描述”)
- 主动抛出的异常同样会导致程序报错终止
print("开始")
raise Exception("主动抛出的异常") # 人为抛出的异常
# 不论什么样的异常,只要不捕捉,代码就会报错终止
print("结束") # 这里的print执行不了,因为上面一句一句抛出了异常,程序终止
捕捉主动抛出的异常
- 不管是什么异常,都需要代码捕捉,不然程序会报错
# 计算器,当用户输入的不是+-*/会抛出异常,并捕捉这个异常
try:
num1 = int(input("请输入整数:"))
num2 = int(input("请输入整数:"))
op1 = input("请输入+-*/")
if op1 != "+" and op1 != "-" and op1 != "*" and op1 != "/":
raise Exception("请输入正确的+-*/")
if op1 == "+":
print(num1 + num2)
elif op1 == "-":
print(num1 - num2)
elif op1 == "*":
print(num2 * num1)
else:
print(num1 / num2)
except Exception as result:
print(result)
当一个函数返回一个布尔值作为条件放到if或者while后面的时候
if 函数名 == True 等价 if 函数名
如果函数返回True,表示条件成立
如果函数返回False,表示条件不成立
如果一个函数返回False,就执行if语句
if not 函数名:
模块(module)
- 一个py文件就是一个模块
- 一个项目是由多个py文件构成的,所以说一个项目是由多个模块组成
- 模块名,也即是py文件名要符合变量名的命名规则
- 一般习惯模块名用小写字母,如果有多个单词,单词之间用下划线分隔
import
- 在一个py文件中使用另一个py文件中内容,需要先用
import
导入模块 - 语法:
import 模块名
模块名.函数
# 在module2.py里面使用module1.py中定义的函数
import module1
print(module1.my_sum(3,4))
导入模块时给模块起别名(as)
- 导入模块同时起别名
import 模块名 as 别名
别名.函数名
import module1 as m
print(m.my_sum(3,4))
from import导入指定内容
- 从指定模块中导入指定的内容
- import默认会把模块中所有内容导入,
from import
会有选择地导入内容 - 语法一
from 模块名 import 函数名
调用函数的时候,不需要在前面接模块名,直接写函数名调用即可
- module1.py
def my_sum(a,b):
return a + b
def my_max(a,b):
if a > b:
return a
else:
return b
- module3.py
# 只想导入module1中的my_max函数
from module1 import my_max
print(my_max(4,5))
- 语法二
from 模块名 import *
导入所有内容,使用内容地时候,不需要写模块名
__name__属性
- 每一个py文件都有一个属性
__name__
- 如果这个py文件是正在执行的模块,那么name属性的值为main
- 如果这个py文件是被其他文件import导入调用的,那么name属性的值就是这个py文件的模块名
- module4.py
def my_test():
print(__name__)
my_test() # 当前如果执行地就是module4这个模块,那么属性__name__地值为__main__
- module5.py
import module4
module4.my_test() #调用module4的my_test函数
包(package)
- 包是一个包含多个模块的特殊目录
- 目录下需要有一个特殊的文件
__init__.py
- 使用包的目的是一次性可以把一个目录下的所有模块通过一条import语句导入
创建包步骤演示
- 第一步:在项目里建立一个目录my_pack
- 第二步:在my_pack目录里创建两个py文件,a1.py,a2.py,内容如下
a1.py:
def my_max(a,b):
if a > b:
return a
else:
return b
a2.py:
def my_sum(a,b):
return a + b
- 第三步:在py_back目录下创建__init__.py文件
*__init__.py
:
from . import a1
from . import a2
- 第四步:在my_pack的上级目录建立一个module6.py文件,建立这个文件的目的是要使用my_pack包
module6.py:
# module6要使用包my_pack
import my_pack
print(my_pack.a1.my_max(3,5))
print(my_pack.a2.my_sum(3,5))
- 使用包中的函数
import 包名
包名.模块名.函数名
使用包注意的点
- 不管目录下有多少模块,只有在
__init__.py
文件中通过import导入模块才能使用 __init__.py
里面的from后面的“ . ”代表相对路径路径
导入包中指定函数
语法:
from 包.模块 import 函数
直接写函数名调用函数即可
from my_pack.a1 import my_max
from my_pack.a2 import my_sum
print(my_max(3,4))
print(my_sum(3,6))