1、异常与错误
错误 分为语法错误,逻辑错误;语法错误过不了python的解释器,不符合python语言的规则,逻辑错误可通过解释器,但是输出错误
----------------->语法错误
1 def test() 2 pass 3 —————————— 4 File "E:/File/h.py/venv/新.py", line 17 5 def test() 6 ^ 7 SyntaxError: invalid syntax
----------------->逻辑错误
1 x=0 2 y=5 3 print(y/x) 4 ------------------- 5 Traceback (most recent call last): 6 File "E:/File/h.py/venv/新.py", line 19, in <module> 7 print(y/x) 8 ZeroDivisionError: division by zero
异常:程序运行过程中所出现的问题
2、标准异常类型
3、异常处理(try--except)
try--except是处理异常的一种手段。例如input输入字符串强制转化为int时,可能会发生异常,若输入数字字符串,不会触发异常,若输入字母字符串,如何强制转化为int。
1 try: 2 age=input(">>>>") 3 age=int(age) 4 print(age) 5 except ValueError as e: 6 print('valueerror') 7 print(e) 8 except KeyError as e: 9 print('keyerror') 10 print(e) 11 --------------------------------- 12 >>>>alex 13 valueerror 14 invalid literal for int() with base 10: 'alex'
可以看到,当输入字符串‘alex’时,并不能把他转化为int,会触发异常。程序从try直接跳转到except中,判断异常属于哪个异常类型与其匹配,可以看到,其为ValueError,跳转到对应的except,执行相应的代码块,需要注意的是as意外着将异常当作e,可打印e,看到异常;
1 try: 2 age=input(">>>>") 3 age=int(age) 4 print(age) 5 # except ValueError as e: 6 # print('valueerror') 7 # print(e) 8 except KeyError as e: 9 print('keyerror') 10 print(e) 11 except Exception as e: 12 print('我可是什么异常都可发现的') 13 print(e) 14 print('我还在执行哦') 15 ----------------------------》 16 >>>>sad 17 我可是什么异常都可发现的 18 invalid literal for int() with base 10: 'sad' 19 我还在执行哦
!!!Exception异常类型可接受任何类型的异常,当异常try——except执行完,不会影响到后面代码的执行
!!!python找异常类型是从第一个except开始找,当找到了即整个except结束,即使可能后面有与之匹配的异常
1 try: 2 age=input(">>>>") 3 age=int(age) 4 print(age) 5 except ValueError as e: 6 print('valueerror') 7 print(e) 8 except KeyError as e: 9 print('keyerror') 10 print(e) 11 except Exception as e: 12 print('我可是什么异常都可发现的') 13 print(e) 14 print('我还在执行哦') 15 -----------------------------》 16 >>>>sad 17 valueerror 18 invalid literal for int() with base 10: 'sad' 19 我还在执行哦
当找到第一个ValueError即停止,即使后面有接受所有异常类型的Exception;;;
当try当中抛出异常时,try异常后面的代码并不会执行,会跳转到except中
4、try--except-else与finally
1 try: 2 age=input(">>>>") 3 age=int(age) 4 print(age) 5 except ValueError as e: 6 print('valueerror') 7 print(e) 8 except KeyError as e: 9 print('keyerror') 10 print(e) 11 # except Exception as e: 12 # print('我可是什么异常都可发现的') 13 # print(e) 14 else: 15 print('我是else') 16 finally: 17 print('我的作用是为异常做善后清理') 18 -------------------------------》 19 >>>>alex 20 valueerror 21 invalid literal for int() with base 10: 'alex' 22 我的作用是为异常做善后清理
当抛出异常时,valueerror来接异常,执行后面代码,但是else代码并未执行,fnally执行了。没有对比就没有发现!
###当输入123时输出 ---------------》 >>>>123 123 我是else 我的作用是为异常做善后清理
当输入123时,代码并未触发异常,自然不会触发except,但是else,finally都触发了!
!!!try——except——else:当try中无异常抛出的时候,else代码会执行
!!!try——except——finally:无论try是否触发异常,都会执行finally下的代码,finally的代码作用是善后,清理作用;例如当try中有异常有关文件的操作时,触发了异常,但文件并未close,finally作用就能体现了;
5、raise主动触发异常
我们可以使用raise 异常类型(“参数”)来主动触发,代码执行到此,会报异常信息参数
1 if 1==1: 2 raise KeyError("出错了") 3 print('我能不能执行呢') 4 ——————--------------- 5 Traceback (most recent call last): 6 File "D:/MyPython/day2/venv/bokeyuan.py", line 51, in <module> 7 raise KeyError("出错了") 8 KeyError: '出错了'
当然不会执行后面代码了
6、断言(assert)
断言是python用来检查一个语句,如果他为真,不做任何工作,如果为假,会报错
1 assert 1==2 2 assert 1==1 3 -----------------------》》 4 Traceback (most recent call last): 5 File "D:/MyPython/day2/venv/bokeyuan.py", line 54, in <module> 6 assert 1==2 7 AssertionError