程松 2020-01-19
在介绍异常处理之前就不能不说一下异常和错误的区别了:
错误有两种:
1.语法错误:代码不符合解释器或者编译器语法
2.逻辑错误:不完整或者不合法输入或者计算出现问题
这些错误都会使程序崩掉。
异常是程序运行时发生错误而产生的信号,由解释器追踪而抛出。
异常不一定是坏的,它可能是我们主动抛出的,但有些异常是解释器自动抛出的、我们无法预测用户会做什么(除非限制得很死)他们操作时也可能产生异常。因此我们要捕捉异常,并做相应的处理。
先看一看异常处理的简单形式:
try: <代码1> except <什么异常> [as <变量名>]: <代码2>
首先程序会执行代码1,假如代码1执行过程中抛出异常了,那么就会去except中的异常哪里确认,抛出是否为你要捕捉的异常(except后面的异常)(包括是否为子类),假如是的话就会执行代码2,不是的话就继续往上冒泡,直到被处理否则解释器就会报错,整个程序就会退出。
下面展示一个小例子,对用户输入的数据进行类型转化
name = input("name>>>") age = input("age>>>") while True: try: print("start type %s \n" % type(age)) age = int(age) break except ValueError as e: print(type(e)) print(e) age = input("age>>>") print("end type%s \n" % type(age)) print(name) print(age) # ############ 以下是命令行输入############ """ name>>>Jack age>>>sb start type <class ‘str‘> <class ‘ValueError‘> # e的类型为异常的类 invalid literal for int() with base 10: ‘sb‘ # ,明显我输入的sb不能被转化为int类型 age>>>22 start type <class ‘str‘> end type<class ‘int‘> Jack 22 Process finished with exit code 0 # 程序正常退出 """
上面展示的:只有用户输入数字才会正常运行,否则就会抛出异常ValueError我们可以选择捕捉它,然后做异常处理。直到输入的是正确的。
注:除了上述一样定义的e包含错误信息外,python的标准库sys也有这样的方法,那就是:sys.exc_info()
在异常处理的else表示的是在不抛出异常时执行
a = "12" b = Nonetry: b = int(a) except ValueError as e: b = 111 else: print(a, b)
finally在英语中有终于、 最终的意思,在python中finally表示的是无论有没有异常,它都会执行(注:有异常时,必须要捕捉了异常,否者定义finally也不会被执行)
如下所示:
name = input("name>>>") age = input("age>>>") try: age = int(age) except ValueError: print("ValueError ... ") finally: print("finally ... ") print(name, age) # ######################## """ # 第一次输入 name>>>Jack age>>>sb ValueError ... finally ... Jack sb # 第二次输入 name>>>Tony age>>>19 finally ... Tony 19 """
正如示例所示,无论我是否输入错了,都会打印 "finally ... ",证明了上面说的:无论异常还是正常的,finally都会执行。
最后想展示以下python的一些常见异常类,以及它们的关系。避免以后只会except Exception,,这样会使得代码维护困难
先上一张图片,主要是想展示它们之间的关系,只画了部分,有些异常类我就没有画出(主要是不知道)
给一个表说明一下这些常见的异常类对应着什么样的异常
异常类 | 解释 |
StopIteration | 迭代器迭代完之后抛出的异常 |
AttributeError | 使用对象调用不存在的方法时抛出 |
ImportError | 导入找不到模块,或在模块中找不到名称时抛出,其子类ModuleNotFoundError也有类似的意义 |
ValueError | 传入的值不对 |
TypeError | 参数类型不正确 |
IndexError | 索引错误,通常是索引超出范围 |
KeyError | 键错误,一般是键输错了 |