一、什么是异常?
简而言之异常就是在程序运行中发生的错误信息
在python中,错误触发的异常如下
这中错误的信息通常分为两种
1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
1 #语法错误示范一 2 if 3 #语法错误示范二 4 def test: 5 pass 6 #语法错误示范三 7 class Foo 8 pass 9 #语法错误示范四 10 print(haha
2.逻辑错误
1 #TypeError:int类型不可迭代 2 for i in 3: 3 pass 4 #ValueError 5 num=input(">>: ") #输入hello 6 int(num) 7 8 #NameError 9 aaa 10 11 #IndexError 12 l=['egon','aa'] 13 l[3] 14 15 #KeyError 16 dic={'name':'egon'} 17 dic['age'] 18 19 #AttributeError 20 class Foo:pass 21 Foo.x 22 23 #ZeroDivisionError:无法完成计算 24 res1=1/0 25 res2=1+'str'
二、python中常见的异常种类
常见的异常种类
1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异常;基本上是无法打开文件 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误 4 IndentationError 语法错误(的子类) ;代码没有正确对齐 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] 6 KeyError 试图访问字典里不存在的键 7 KeyboardInterrupt Ctrl+C被按下 8 NameError 使用一个还未被赋予对象的变量 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) 10 TypeError 传入对象类型与要求的不符合 11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 12 导致你以为正在访问它 13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
不常见的种类也很多,在这里就不一一列举了。
三、异常处理
在我们遇到一些不可预知的错误,则需要用到try...except:在错误发生之后进行处理
基本语法为
try:
被检测的代码块
except 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑
1 def name(): 2 print("你的名字") 3 [][1] 4 try: 5 print(name()) 6 except IndexError: 7 print("有异常操作")
在我们处理异常的时候需要注意一下几点
1.异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
1 s = "你的微笑" 2 try: 3 print(int(s)) 4 except ValueError as e: 5 print(e) 6 # 运行结果 : invalid literal for int() with base 10: '你的微笑' 7 8 try: 9 print(int(s)) 10 except NameError as e: # 当异常类型不匹配时,直接报错 11 print(e) 12 # 运行结果 : ValueError: invalid literal for int() with base 10: '你的微笑'
2.多分支
1 s1 = '月牙湾' 2 try: 3 int(s1) 4 except IndexError as e: 5 print(e) 6 except KeyError as e: 7 print(e) 8 except ValueError as e: 9 print(e)
3.万能异常Exception
1 def buy(): 2 print("买") 3 name 4 def look(): 5 print("看") 6 [][1] 7 def play(): 8 print("玩") 9 1/2 10 def main(): 11 lis = [("买",buy),("看",look),("玩",play)] 12 while True: 13 for index,content in enumerate(lis,1): 14 print(index,content[0]) 15 user_input=int(input("请输入序号")) 16 print(lis[user_input-1]) 17 try: 18 func = lis[user_input-1][1] 19 func() 20 except Exception as e: 21 print("操作异常:"+str(e.__traceback__.tb_lineno)+"行"+str(e.args)) 22 print("你在执行%s操作时发生了个异常" %(lis[user_input-1][0])) 23 main()
4.当多分之与万能分支一起使用时
1 try: 2 pass 3 except (ValueError,IndentationError): 4 print("针对性的处理") 5 except Exception as e: 6 print(e) 7 print("通用性的处理")
5.else 分支 与 finally 分支
1 s1 = '平静的大海' 2 try: 3 int(s1) 4 except IndexError as e: 5 print(e) 6 except KeyError as e: 7 print(e) 8 except ValueError as e: 9 print(e) 10 #except Exception as e: 11 # print(e) 12 else: 13 print('try内代码块没有异常则执行我') 14 finally: 15 print('无论异常与否,都会执行该模块,通常是进行清理工作')
6.主动抛出异常
1 try: 2 raise TypeError('错误') 3 except Exception as e: 4 print(e)
7.断言:assert 条件
1 if int(input())==1: 2 pass 3 else: 4 raise AssertionError 5 # 只有在输入1的时候不会报错,否者抛出错误 6 7 # 通过上述分析 8 #assert 1==1 # assert 断言 判断bool类型 只接收 Ture False 9 # assert 1==2 #AssertionError
8.自定义异常
1 # 异常处理 2 import os 3 class ExistsError(Exception): # 自定义一个异常表示当文件不存在时报错 4 pass 5 class KeyInvalidError(Exception): # 自定义一个异常表示当关键字为空时报错 6 pass 7 def func(path,prev): #编写一个函数,用来判断输入的地址是否可以被获取 8 """ 9 去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者 10 :param path: 11 :param prev: 12 :return: 13 14 """ 15 result = {"code":1000,"data":None} 16 try: 17 if not os.path.exists(path): 18 raise ExistsError() 19 if not prev: 20 raise KeyInvalidError() 21 except ExistsError as e: 22 result["code"]=1001 23 result["data"]="文件不存在" 24 except KeyInvalidError as e: 25 result["code"] = 1002 26 result["data"] = "关键字异常" 27 except Exception as e: 28 result["code"] = 1003 29 result["data"] = "文件不存在" 30 return result