异常概念(了解)
当python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的异常。
# 异常:程序运行过程中,代码遇到错误提示,给出错误的提示
print('其他的代码......')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
num = 10 / int(num)
print('计算得到的结果是:', num)
print('其他代码...')
2.捕获单个异常(掌握)
"""
try:
可能发生异常的代码
except 异常的类型:
发生异常执行的代码
"""
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
try:
num = 10 / int(num)
print('计算得到的结果是:', num)
except ZeroDivisionError:
print('输入有误')
print('其他代码...')
3.捕获多个异常(掌握)
# 法一:
# num = input('请输入一个数字:')
# # ZeroDivisionError: division by zero
# try:
# a = int(num)
# num = 10 / a
# print('计算得到的结果是:', num)
# except (ZeroDivisionError, ValueError):
# print('输入有误')
# print('其他代码...')
print('其他代码....')
num = input('请输入一个数字:')
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except ZeroDivisionError:
print('输入有误')
except ValueError:
print('输入有误')
print('其他代码....')
4.打印异常信息(掌握)
"""
try:
可能发生异常的代码
except (异常的类型1,异常类型2,....)as 变量名 :
发生异常执行的代码
print(变量名)
"""
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except (ZeroDivisionError, ValueError) as e:
print('输入有误', e)
print('其他代码...')
5.捕获所有类型的异常(掌握)
try :
可能发生异常的代码
except : #缺点,不能获取异常的描述信息
发生异常执行的代码
# --------------------------------------------------------------
try :
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
pass
# Exception 是常见异常类的父类,
ZeroDivisionError-->ArithmeticError-->Exception-->BaseException-->object
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except Exception as e:
print('输入有误', e)
print('其他代码...')
6.异常的完整结构(掌握)
try :
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
else:
代码没有发生异常,会执行
finally:
不管有没有发生异常,都会执行
print('其他代码...')
num = input('请输入一个数字:')
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except Exception as e:
print('输入有误', e)
else:
print('没有发生异常,我会会执行')
finally:
print('不管有没有发生异常,我都会执行')
print('其他代码...')
7.异常的传递(理解)
是 python异常处理的底层机制,是原理层面上的,不需要我们自己写代码实现,是python 已经实现好的
异常传递:当一行代码发生异常之后,会向外层将这个异常进行传递,指导被捕获或者程序报错为止
1.try 嵌套
2.函数嵌套
print('其他代码...')
num = input('请输入一个数字:')
try:
try:
a = int(num)
except ZeroDivisionError:
print('发生异常')
finally:
print('不管有没有发生异常,我都会执行')
num = 10 / a
print('计算得到的结果是:', num)
except Exception as e:
print(e)
print('其他代码...')
def func1():
print('-----------1-------------')
num = input('请输入数字')
num = 10 / int(num)
print('-----------2---------')
def func2():
print('-------3------')
func1()
print('------------4--------')
try:
print('------5--------')
func2()
print('---------------6-----------')
except Exception as e:
print('-------7----------')
print(e)
8.抛出自定义异常(理解)
程序为什么会报错?
因为不合法语法,因为python的作者在代码使用了if判断,如果出书为0,就会在代码中抛出异常错误,
抛出异常:
raise 异常对象 # 当程序代码遇到 raise 的时候,程序就报错了
异常对象=异常类(参数)
抛出自定义类:
1.自定义异常类,继承Exception 或者 BaseException
2.选择书写,定义__init__方法,定义__str__方法
3.在合适的时机抛出异常对象即可
class PasswordLengthError(Exception):
def get_password(): # 等同于系统定义函数
password = input('请输入密码:')
if len(password) >= 6:
print('密码长度合格')
else:
# 抛出异常
raise PasswordLengthError('密码长度不足6位')
try:
get_password() # 调用系统的函数
except PasswordLengthError as e:
print(e)
9.模块
import random
random.randint(a,b) 产生[a,b]之间的随机整数,包含b的
import os
模块就是python1代码文件,是别人已经写好的代码文件,文件中的函数类以及变量,我们都可以使用
使用模块的好处:直接使用别人已经实现好的功能,
模块制作:
模块就是python文件
制作一个模块文件,其实就是定义一个Python代码文件
注意点:模块的名字要遵循标识符的规则(有字母,数字和下划线组成,不能以数字开头)
模块中可以定义变量,定义函数,定义类
10.模块的导入
1.想要使用模块中的内容,必须先导入模块
2.注意点:如果导入的是自己书写的模块,使用的模块和代码文件需要在一个目录中
# ----模块的导入-----
# 方法一:(推荐使用)
# import 模块名
# 使用:模块名.功能名
import my_modle1
print(my_modle1.num) # 使用my_module1中的变量num
my_modle1.func() # 调用my_module1中func函数
dog = my_modle1.Dog() # 调用my_module1中的类创建对象
dog.show_info()
# 方法二: from 模块名 import 功能名1,功能名2,......
# 使用:功能名
# 注意点:如果存在同名的方法名,则会被覆盖
# from my_modle1 import func, num
#
# print(num)
# func()
# 方法三: from 模块名 import * #将模块中所有的功能进行导入
# 使用:功能名(不推荐使用)
from my_modle1 import *
print(num)
func()
dog = my_modle1.Dog()
dog.show_info()
# as 起别名,可以对模块和功能起别名,
# 注意:如果使用as 别名,就不能在使用原来的名字
11.__all__变量(模块中的变量)
__all__ = ['num','func','Dog']
num = 1
def func():
print('my_module1 func...')
class Dog(object):
@staticmethod
def show_info():
print('这是一个Dog类,my_module1 dog')
pass
"""
__all__变量,可以在每个代码文件中(模块中)定义,类型是元组,列表
作用:影响from 模块名 import *导入行为,另外两种导入行为不受影响
1.如果没有定义__all__变量,模块中的所有功能,都可以被导入
2.如果定义__all__变量,只能导入 变量中定义的内容
"""
from my_modle1 import *
print(num)
func()
dog = Dog()
dog.show_info()
12.模块的注意点
# 自己定义的模块名字,不要和系统中你要使用的模块名字相同
import random
# 模块的搜索顺序,当前目录 --->系统目录--->程序报错
print(sys.path)
a = random.randint(1, 5)
print(a)
13.包
包:功能相近或者相似的模块放在一个目录中,并在目录定义一个__init__.py文件,这个目录就是包。
# 方法一:import 包名.模块名
import my_package.mod2
my_package.mod2.func()
# 方法二:
from my_package.mod2 import func
from my_package.mod2 import *
func()
# 方法三:from 包名 import * #导入的是__init__.py中的内容
from my_package import *
func()