11.异常处理与模块
异常处理
当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。
| 异常名称 | 描述 | 
|---|---|
| AttributeError | 对象没有这个属性 | 
| OSError | 操作系统错误 | 
| ImportError | 导入模块/对象失败 | 
| IndexError | 序列中没有此索引(index) | 
| KeyError | 没有这个键 | 
| NameError | 未声明/初始化对象 (没有属性) | 
| SyntaxError | Python 语法错误 | 
| TypeError | 对类型无效的操作 | 
| ValueError | 传入无效的参数 | 
| Warning | 警告的基类 | 
什么是异常
- 
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 
- 
一般情况下,在Python无法正常处理程序时就会发生一个异常。 
- 
异常是Python对象,表示一个错误。 
- 
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。 
异常处理
- 
捕捉异常可以使用try/except语句。 
- 
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。 
- 
如果你不想在异常发生时结束你的程序,只需在try里捕获它。 
try:
    可能会发送错误的语句
except:
    发生错误后执行的语句
快速体验
try:
    print(name)
except NameError:
    print("发生错误")
如果尝试执⾏的代码的异常类型和要捕获的异常类型不⼀致,则⽆法捕获异常。
捕获多个异常
try:
     print(1/0)
except (NameError, ZeroDivisionError):
     print('有错误')
异常的else
else表示的是如果没有异常要执⾏的代码。
try:
    print(123+"456")
except Exception:
    print(456)
else:
    print(789)
异常的finally
finally表示的是⽆论是否异常都要执⾏的代码,例如关闭⽂件。
try:
    f = open("test.txt","r")
    print("没有异常,正常创建")
except Exception:
    print("出现异常,重新创建")
    f = open("test.txt","w")
finally:
    f.close()
自定义异常
自定义异常类,必须要继承Exception,并且包含init和str魔术方法(设置异常描述)
在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
需求:输入密码,如果密码长度不足6位,则抛出异常
# -*- coding:utf-8 -*-
class Error_Project(Exception):
    def __init__(self,password,password_len):
        self.password = password
        self.password_len = password_len
    def __str__(self):
        return f"你输入的密码长度为---{self.password}---,不能少于---{self.password_len}---字符"
def main():
    try:
        pwd = input("请输入密码:")
        if len(pwd) < 6:
            raise Error_Project(len(pwd),6)
    except Exception as exc:
        print(exc)
    else:
        print("密码创建完毕!")
main()
模块
导入模块的方式
- 
import 模块名 
- 
from 模块名 import 功能名 
- 
from 模块名 import * 
- 
import 模块名 as 别名 
- 
from 模块名 import 功能名 as 别名 
时间模块time
获取当前时间
从返回浮点数的时间戳方式向时间元组转换,只要将浮点数传递给如localtime之类的函数
import time
now_time1 = time.localtime(time.time())
print(now_time1)
# time.struct_time(tm_year=2022, tm_mon=9, tm_mday=7, tm_hour=15, tm_min=52, tm_sec=32, tm_wday=2, tm_yday=250, tm_isdst=0)
获取格式化的时间
import time
now_time2 = time.asctime(time.localtime(time.time()))
print(now_time2)
格式化日期
import time
# 格式化成2022-09-70 时:分:秒形式
now_time3 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(now_time3)
python中时间日期格式化符号
年
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
月
- %m 月份(01-12)
日
- %d 月内中的一天(0-31)
时
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
分
- %M 分钟数(00-59)
秒
- %S 秒(00-59)
获取某月日历
Calendar模块有很广泛的方法用来处理年历和月历
import calendar
# 获取2022年,9月份日历
mouth_rl = calendar.month(2022,9)
制造模块
在Python中,每个Python⽂件都可以作为⼀个模块,模块的名字就是⽂件的名字。也就是说⾃定义模块名必须要符合标识符命名规则。
新建一个python文件,命名my_demo,并在里面写一个函数
# -*- coding:utf-8 -*-
def func(a,b):
    print(a+b)
class Func(object):
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def func_demo(self):
        print(self.a+self.b)
如果⼀个模块⽂件中有 __all__ 变量,当使⽤ from xxx import * 导⼊时,只能导⼊这个列表中的元素。
__all__ = ['testA']
def testA():
     print('testA')
def testB():
     print('testB')
调用模块
import 模块名
制作包
[New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
导入包
# 方法一
import 包名.模块名
包名.模块名.⽬标
# 方法二
# 注意:必须在 __init__.py ⽂件中添加 __all__ = [] ,控制允许导⼊的模块列表。
from 包名 import *
模块名.⽬标
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号