东尧爱分享
这是东尧每天一篇文章的第24天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
1
错误和异常的概念
01
错误
在程序上来讲错误主要有语法错误和逻辑错误。语法错误知识程序的结构上有错误,导致不能被解析器解析或编译器编译。这些错误必须在程序执行前纠正。逻辑错误可能是由于不完整或不合法的输入所致。
02
异常
异常就是因为程序出现了错误而在正常控制流以外才去的行为。这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的控制措施)阶段。
第一个阶段是在发生了一个异常条件后发生的。只要检测到错误并且意识到异常条件,解析器就会引发一个异常,也叫触发异常或抛出异常。解析器通过它通知当前控制流有错误发生。python也允许程序员自己引发异常,无论是谁引发的,异常就是错误发生的信号。然后当前的流被打断,进入第二阶段。
对异常的处理,异常发生之后,可以调用很多不同的操作。可以是忽略错误或记录错误但不采取措施或采取补救措施后终止程序或者是减轻问题的影响后设法让程序继续执行。至于到底怎么做取决于程序员自己的。
2
python中的异常
01
几个异常的例子
NameError:尝试访问一个未声明的变量
ZeroDIvisionError:除数是0
SyntaxError:python解析器语法错误
IndexError:请求超出了索引操作范围
KeyError:请求一个不存在的字典关键词
FileNotFoundError:找不到文件
AttributeError:访问一个不存在的属性
NameError:尝试访问一个未声明的变量
>>> name
Traceback (most recent call last):
File "", line 1, in
NameError: name 'name' is not defined
ZeroDIvisionError:除数是0
>>> 1 / 0
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: division by zero
SyntaxError:python解析器语法错误
>>> a ++
File "", line 1
a ++
^
SyntaxError: invalid syntax
IndexError:请求超出了索引操作范围
>>> list = [1,2,3,4,5]
>>> list[8]
Traceback (most recent call last):
File "", line 1, in
IndexError: list index out of range
KeyError:请求一个不存在的字典关键词
>>> d = {'a':1}
>>> d[2]
Traceback (most recent call last):
File "", line 1, in
KeyError: 2
AttributeError:访问一个不存在的属性
>>> open('1'.txt)
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'str' object has no attribute 'txt'
FileNotFoundError:找不到文件
>>> open('1.txt')
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
在发生异常后如未设置处理方法,那么程序会被中断,后面的代码就不会被继续执行了。例如下面的例子,变量a未声明,中断程序后,后面的“hello”也不会被打印出来。但是,如果print('hello')在异常代码之前的话,还是可以执行被打印出来的:
02
检测和处理异常
异常可以通过try语句来检测,任何在try语句块里面的代码都会被检测,检查有无异常发生。
try语句有两种主要形式:try-except和try-finally。这两个句子是互斥的,也就是说你只能使用其中的一种。一个try语句可以对应一个或多个except语句,但只能对应一个finally语句,或是一个try-except-finally复合语句。
try语句后加需要检测异常的代码块,except语句后面加预测异常类型和异常原因,以及捕获异常后的处理方式,finally语句后加最终必然执行的语句块。
使用try-except语句
try:
a
except NameError: # 捕获NameError异常
print('变量a没有声明') # 如果捕获到异常则执行此段代码
print('hello')
结果:
变量a没有声明
hello
以上是except后面预测的异常与实际异常相同的情况,那么假如预测的异常与实际异常不一致会发生什么情况呢?让我们来测试一下:
try:
open('1.txt')
except NameError: # 预测捕获NameError异常,但实际是FileNotFoundError异常,所以捕获不到
print('变量a没有声明') # 如果捕获到异常则执行此段代码
print('hello')
>>> name = input()
bai
结果:
Traceback (most recent call last):
File "D:/learning/python/learning/test1.py", line 4, in
open('1.txt')
FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
可以看到,如果预测的异常与实际异常不一致,那么系统仍然会中断程序,不会按照预设的异常处理方法来处理,并且异常代码之后的代码也不会被执行。(上面的案例中,print('hello')并没有被执行出来) 。
打印异常原因:try-except 语句能够使用as来打印异常原因
# 打印异常原因
try:
open('1.txt')
except FileNotFoundError as e: # e:异常原因
print('异常原因:',e)
print('hello')
结果:
异常原因: [Errno 2] No such file or directory: '1.txt'
hello
语法错误:语法错误即使能捕获到,也无法处理,只能中断程序
try:
list.4
except SyntaxError: # 捕获语法错误异常
print('语法错误')
print('hello')
结果:
带有多个except的try语句:
需要注意的是,python会自上而下根据异常出现的顺序,自动检测出第一个异常并跳过其后的异常
try:
a
open('1.txt')
except NameError: # 捕获NameError异常
print('命名错误')
except FileNotFoundError:
print('未找到文件')
print('hello')
这里虽然对两个异常都进行了预测并处理,但是我们看实际运行结果是只处理了一个:
命名错误
hello
一次性捕获多个异常
try:
a
open('1.txt')
except (NameError,FileNotFoundError) as e:
print('异常:',e)
结果:
异常: name 'a' is not defined
今天的教程介绍了几种常见的异常情况,并给出了try-except的解决方法。在今天的异常处理方法中,我们都必须将预测的异常类型写到except后面来捕获异常,但实际在检测时我们不可能完全预测到全部的异常,那么这个时候我们该怎么写异常检测程序呢?我们所熟知的异常类型又有哪些呢?
这些都留到我们明天的教程中一一为您解答。欢迎明天继续关注东尧的最新推文《【python教程25】python异常捕获及处理方法(二)》
领取专属 10元无门槛券
私享最新 技术干货