异常处理与断言

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、标准异常类型

ZeroDiviceError:被除数写成了0
NameError:变量未定义
TypeError:不同类型数据进行相加
IndexError:超出索引范围
KeyError:没有对应名称的键
ValueError:将字符型数据转换成整型数据
AttributeError:对象没有对应名称的属性

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

 

猜你喜欢

转载自www.cnblogs.com/XiaoJin0/p/10176398.html