多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### **异常:** ``` 1.程序执行过程中, python解释器遇到错误,程序不再向下执行,并且提示错误信息,这就是异常 2.程序不再向下执行,并且提示错误信息的动作,就是抛出( ralse)异常 3.岀现异常需要捕捉异常,为什么?程序开发人员无法消灭异常(比如网络不稳定), 只能靠捕捉异常,并对捕捉到的异常进行相应处理(图片加载失败,要提示相应的错误信息) ``` <br /> ### **异常的捕获:----异常的重点** ``` 1.使用 try....except来捕获异常并处理异常,把可能出现异常的代码放在try缩进部分 2.except部分的代码只有在发生异常时才会执行,可以处理异常修复或信息提示 3.只要捕捉了异常,不管try部分异常是否发生,程序都可以正常结束 4.在try语句中出现异常,异常后面的代码不再执行 ``` <details> <summary>09_异常捕获.py</summary> ``` # 09_异常捕获 ''' 异常捕获的语法: try: 可能出现异常的代码 except: 如果try部分出现了异常,except部分一定会执行 except()部分主要用来捕获异常,并处理异常 注意: 只要捕获了异常,try部分无论有没有异常,程序都可以正常结束 try部分有多个异常,只会捕获第一个异常 ''' try: num = 1 print(num) except: print("已经捕获到异常了,对异常进行处理") print("程序结束了") ``` </details> <br /> ``` 5.捕获指定异常时,在 except后面添加异常类型 格式: except 异常类型 6.对同一个异常捕获多次,只执行第一次捕获的异常代码 7.一次捕获多个异常 格式: except(异常类型1,异常类型2,…) 作用:对不同的异常有相同的处理结果 8.捕获任意类型异常 格式: except Exception: ``` <details> <summary>10_一次捕获多个异常.py</summary> ``` # 10_一次捕获多个异常 ''' 一次捕获多个类型异常的语法: try: 可能出现异常的代码 except (异常的类型1,异常的类型,异常的类型3…): 对上述异常的类型1,异常的类型2,异常的类型3,有相同的处理结果 如果try部分出现了异常, except部分一定会执行 except()部分主要用来捕获异常,并处理异常 ''' try: print(num) except(NameError, FileNotFoundError): # 一次捕获多个异常 print("已经捕获到资源未找到异常了,对异常进行处理") except ValueError: print("已经捕获到值错误异常,对异常进行处理") except ZeroDivisionError: # 对同一个异常捕获多次,只能执行一次 print("已经捕获到,除数为0错误异常,对异常进行处理----1---") print("程序结束了") print("---1---") print("---2---") print("---3---") ``` </details> <br /> ``` 9.获取异常的错误信息,给异常类型起别名, except 异常类型名 as 别名 (别名中记录异常的错误信息) ``` <details> <summary>12_捕获异常的错误信息.py</summary> ``` # 12_捕获异常的错误信息 ''' try: 可能出现异常的代码 except 异常的类型 as 别名: 如果try部分出现了异常, except部分一定会执行 except()部分主要用来捕获异常,并处理异常 except (异常的类型1,异常的类型2,异常的类型3....) as 别名: 对上述异常的类型1,异常的类型2,异常的类型3,有相同的处理结果 如果try部分出现了异常, except部分一定会执行 except()部分主要用来捕获异常,并处理异常 except Exception as 别名: print("Exception捕获任意类型异常") 别名中保存异常的错误信息 ''' try: lt = [10, 20] print(lt[5]) # def func(num): # print("--func---") # func() except NameError as ret: # 一次捕获多个异常 print("已经捕获到资源未找到异常了,对异常进行处理", ret) except ValueError as exp: print("已经捕获到值错误异常,对异常进行处理", exp) except ZeroDivisionError as exp: # 对同一个异常捕获多次,只能执行一次 print("已经捕获到,除数为0错误异常,对异常进行处理----1---", exp) except Exception as exp: print("捕获到任意类型异常了,对异常进行处理...", exp) print("程序结束了") print("---1---") print("---2---") print("---3---") ``` </details> <br /> ### **异常的完整语法:** ``` 1. 格式: try: # 可能会出现异常的代码 except 异常类型1: # 针对异常类型1的处理代码 except 异常类型2: # 针对异常类型2的处理代码 except (异常类型3,异常类型4): # 针对异常类型3或异常类型4的处理代码 except Exception as exp: # exp中获取异常的错误信息 # except部分只有在发生异常时才会执行 else: # else部分在没有发生异常时才会执行 finally: # finally部分无论有没有异常都会执行... 2.应用场景,在打开文件向文件写入数据时程序崩溃, 此时可以在 finally部分添加关闭文件资源的操作,避免系统资源浪费 ``` <details> <summary>14_异常的完整语句结构应用.py</summary> ``` # 14_异常的完整语句结构应用 try: file = open("new.txt", "w", encoding="utf-8") file.write([10, 20, 30]) except NameError as ret: # 一次捕获多个异常 print("已经捕获到资源未找到异常了,对异常进行处理", ret) except ValueError as exp: print("已经捕获到值错误异常,对异常进行处理", exp) except ZeroDivisionError as exp: # 对同一个异常捕获多次,只能执行一次 print("已经捕获到,除数为0错误异常,对异常进行处理----1---", exp) except Exception as exp: print("捕获到任意类型异常了,对异常进行处理...", exp) else: print("try部分没有异常,else一定会执行") finally: print("finally 无论有没有异常都会执行") print("----222-----") file.close() print("---333---") print("程序结束了") print("---1---") print("---2---") print("---3---") ``` </details> <br /> ``` 异常的传递: 1.如果在被调用的函数中有异常没有捕获处理,则会把异常传递给调用的地方 2.最终传递到Python解释器依然没有捕获异常,则程序崩溃 抛出异常: 1.创建 Exception异常类的对象 有参数:字符串 2.使用 ralse抛出异常,语法: raise Exception("异常的错误提示信息") ``` <details> <summary>15_抛出异常.py</summary> ``` # 15_抛出异常 # 定义 input_password()函数,提示用户输入密码 def input_password(): pwd = input("请输入密码:") # 如果用户输入密码长度<8位,抛出异常 if len(pwd) < 8: print("抛出异常") # (1)使用Exception类创建对象 Exception(错误的提示) ex = Exception("错误:密码长度小于8位") # (2)使用raise 抛出异常对象 raise ex # 如果用户输入长度 >=8位,返回输入的密码 else: return pwd try: ret = input_password() print(ret) except Exception as exp: print("捕获任意类型异常, exp:", exp) ``` </details> <br /> ### **模块:** ``` 1.以.py结尾的文件原则上都可以作为模块使用,把成熟稳定的代码封装到模块中 便于其它开发者使用 2.模块名必须符合标识符的命名规范,(由数字,字母,下划线组成,并且不能以数字开头) 3.模块中可以封装全局变量,函数,类等,当做工具可以提供给其它开发者使用 4.使用模块,则需要: 1).先导入模块 import 模块名 2).使用模块中工具, 模块名.全局变量名,模块名.函数名() 5.如果模块名太长,可以使用as给模块起别名 ①格式: import 模块名 as 模块别名 ②注意:模块别名要符合大驼峰命名法则 ``` <details> <summary>model1.py</summary> ``` # model1.py # 当前Python文件可以作为模块 # 全局变量 g_num = 100 # 函数 def func(): print("-----model1.py---func---01----") # 类 class Cat: def __init__(self): self.name = "汤姆猫" def eat(self): print("%s 爱吃鱼" % self.name) ``` </details> <br /> <details> <summary>model2.py</summary> ``` # model2.py # 当前Python文件可以作为模块 # 全局变量 gl_str = "hello" # 函数 def func(): print("-----model2.py---func---02----") # 类 class Cat: def __init__(self): self.name = "大懒猫" def eat(self): print("%s 爱吃鱼" % self.name) ``` </details> <br /> <details> <summary>01_导入模块.py</summary> ``` # 01_导入模块.py # 1.导入模块 import day09.model1 import day09.model2 # 2.使用模块中工具 模块名.变量名 / 模块名.函数名() 模块名.类名() # 模块名.变量名 print(day09.model1.g_num) print(day09.model2.gl_str) # 模块名.函数名() tom = day09.model1.Cat() tom.eat() # 模块名.类名() ``` </details> <br /> ``` 6.注意: from ... import导入模块中工具(全局变量,函数,类) 格式: from 模块名 import 工具名 如果工具名相同,后导入的工具名会覆盖之前导入的工具名 解决办法:用as给工具名起新的别名 7.还可以使用from ... import * 导入模块中工具 这种方式可以将模块中所有的全局变量,函数,类都作为工具导入 注意: 不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查 导入模块的两种方式: 1. import 模块名 特点:将模块中所有的全局变量,函数,类全部导入 访问方式:模块名.全局变量 模块名.函数() 模块名.类名() 2.from 模块名 import 全局变量/函数/类名 特点:将所需要的全局变量/函数/类名导入 访问方式:直接使用 全局变量名/函数()/类名() 模块的搜索顺序: 1.导入模块时,先在当前目录下查找,如果查找到了,就导入 2.如果当前目录下没有找到模块,则导入系统模块 3.可以使用__file__属性查看模块的路径,使用方式:模块名.__file__ 4.在开发时,给文件起名,不要和系统的模块文件名相同 ``` <details> <summary>03_使用from...import方式导入.py</summary> ``` # 03_使用from...import方式导入 # 导入 from 模块名 import 工具名 from day09.model1 import g_num from day09.model1 import func from day09.model1 import Cat # 不需要使用 模块名. 方式 直接使用工具 print(g_num) # 直接使用函数 func() # 直接使用类名 创建对象 tom = Cat() tom.eat() ``` </details> <br /> <details> <summary>04_使用from...import方式导入.py</summary> ``` # 04_使用from...import方式导入 # 导入 from 模块名 import 工具名 如果有同名的工具,后面的工具名会覆盖前面的 # 解决办法 使用as给工具起别名 from day09.model1 import func from day09.model2 import func as func02 # 直接使用函数 func() func02() ``` </details> <br /> ### **__name__内置属性** ``` 1.__name__內置属性可以做到,模块代码在测试情况下执行,而在被导入情况下不会执行 2.如果在当前文件中直接打印__name__内置属性,则直接输出字符串__main__ 3.如果当前文件被当做模块导入,在导入的文件中直接运行时,则__name__内置属性 输出的就是当前被导入的模块名 4.如果要做到代码在测试情况下执行,而不会在导入情况下执行, 要在当前文件中添加i条件判断 if __name__ == "__main__": ``` <details> <summary>model3.py</summary> ``` # model3.py # 当前python文件自己运行 __name__ 中是字符串 __main__ # 当前python文件被别人导入,__name__中是字符串 model3.py print("__name__:", __name__) def mutiple_table(): '''for循环定义九九乘法表''' for i in range(1, 10): for j in range(1, 1 + i): print("%d * %d = %d\t" % (j, i, j * i), end="") print("") if __name__ == "__mian__": print("当前python文件可以被当做模块导入") print("===========111===========") mutiple_table() ``` </details> <br /> ### **包:** ``` 1.包是包含很多模块的特殊的目录 2.包中包含__init__.py文件 3.我们可以把包直接给调用者,调用者导入包后,可以获取到包中所有的模块 导入包的方式: import 包名 4.创建包的两种方式: ① 在 PyCharm中新建一个文件夹,在文件夹新建文件__init__.py ② 在 PyCharm中可以直接新建 Python Package 5.如果想要把包给其它开发者导入使用, __init__.py中指定对外界提供的模块列表 需要在__init__.py文件中添加 from . import 模块名 6.导入包方式: ① import 包名 import 包名.模块名 ②from 包名 import 模块名 from 包名.模块名 import 函数名/类名 ``` 示例: ``` # 1.import 包名 import message # 2.from 包名 import 模块名 from message import send_message from message import receive_message # 包名.模块名.函数名() message.send_message.send() # 模块名.函数名() receive_message.receive() ```