程序在运行过程当中,不可避免的会出现一些错误,比如:使用了没有赋值过的变量,使用了不存在的索引,一个数字除以0,这些错误在程序中,我们称其为异常,那么如何处理这些异常呢,今天我们就来看一看
- 程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!
1 | 语法错误
指解析代码时出现的错误。当代码不符合Python 语法规则时,Python解释器在解析时就会报出 SyntaxError 语法错误,与此同时还会明确指出最早探测到错误的语句。例如:
1 |
|
我们知道,Python 3.0已不再支持上面这种写法,所以在运行时,解释器会报如下错误:
SyntaxError: Missing parentheses in call to 'print'
语法错误多是开发者疏忽导致的,属于真正意义上的错误,是解释器无法容忍的,因此,只有将程序中的所有语法错误全部纠正,程序才能执行。
2 | 运行时错误
运行时错误,即程序在语法上都是正确的,但在运行时发生了错误。例如:
1 |
|
上面这句代码的意思是“用 1 除以 0,并赋值给 a 。因为0 作除数是没有意义的,所以运行后会产生如下错误:
Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: division by zero
3 |其他异常
以上运行输出结果中,前两段指明了错误的位置,最后一句表示出错的类型。在 Python 中,把这种运行时产生错误的情况叫做异常(Exceptions)。
这种异常情况还有很多,常见的几种异常情况如下表:
异常类型 | 含义 | 实例 |
AssertionError | 当 assert 关键字后的条件为假时,程序运行会停止并抛出此异常 | >>> assert 1>0 >>> assert 1<0 AssertionError |
AttributeError | 当试图访问的对象属性不存在时,抛出的异常 | >>> s="hello" >>> s.len AttributeError: 'str' object has no attribute'len' |
IndexError | 索引超出序列范围,会引发此异常 | >>> s="hello" >>> s[5] IndexError: string index out of range |
KeyError | 字典中查找一个不存在的关键字时,引发此异常 | >>> demo_dict={"age": 20} >>> demo_dict["name"] KeyError: 'name' |
NameError | 尝试访问一个未声明的变量时,引发此异常 | >>> hello NameError: name 'hello' is not defined |
TypeError | 不同类型数据之间的无效操作 | >>> 1+"2" TypeError: unsupported operand type(s) for +: 'int' and 'str' |
ZeroDivisionError | 除法运算中除数为 0 引发此异常 | >>> a = 1/0 ZeroDivisionError: division by zero |
4 | 异常处理
程序运行时出现异常,目的并不是让我们的程序直接终止!Python是希望在出现异常时,我们可以编写代码来对异常进行处理!
Python 提供了try except语句捕获并处理异常,该异常处理语句的基本语法结构如下:
1 2 3 4 5 6 |
|
该格式中,[ ] 括起来的部分可以使用,也可以省略。其中各部分的含义如下:
- (Error1, Error2,...) 、(Error3, Error4,...):其中,Error1、Error2、Error3 和Error4 都是具体的异常类型。显然,一个 except 块可以同时处理多种异常。
- [as e]:作为可选参数,表示给异常类型起一个别名 e,这样做的好处是方便在except 块中调用异常类型(后续会用到)。
- [Exception]:作为可选参数,可以代指程序可能发生的所有异常情况,其通常用在最后一个 except 块。
- 注:except 后面也可以不指定具体的异常名称,这样的话,表示要捕获所有类型的异常。
另外,从 try except 的基本语法格式可以看出,try 代码块仅有一个,但except 代码块可以有多个,这是为了针对不同的异常类型提供不同的异常处理方式。当程序发生不同的意外情况时,会对应不同的异常类型,Python 解释器就会根据该异常类型来决定使用哪个 except 块来处理该异常。